Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Making Sure Your Forms Don't Suck
Search
Damian Nicholson
October 23, 2017
Technology
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Making Sure Your Forms Don't Suck
Damian Nicholson
October 23, 2017
More Decks by Damian Nicholson
See All by Damian Nicholson
Designing form validation the right way
damian
0
320
Chrome DevTools tips and tricks
damian
0
180
Writing testable, scalable, maintainable rock-solid JavaScript
damian
5
1.6k
Ten Things You Should Know About Jasmine
damian
2
1.1k
Other Decks in Technology
See All in Technology
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
7.4k
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
150
2026 AI Memory Architecture
nagatsu
0
100
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
1
210
AIが自律的に回る開発ループを設計してチーム開発に組み込む
nekorush14
0
130
PostgreSQL 19 新機能概要 OSC Hokkaido 2026
nori_shinoda
0
240
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
140
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
130
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
3
830
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
260
起点・思考・出力で分解する 〜PM業務の自動化設計〜
kazu_kichi_67
1
1k
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
180
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
58k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Balancing Empowerment & Direction
lara
6
1.2k
Prompt Engineering for Job Search
mfonobong
0
350
For a Future-Friendly Web
brad_frost
183
10k
Building the Perfect Custom Keyboard
takai
2
800
Deep Space Network (abreviated)
tonyrice
0
210
Paper Plane
katiecoart
PRO
1
52k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
580
Typedesign – Prime Four
hannesfritz
42
3.1k
The agentic SEO stack - context over prompts
schlessera
0
820
Transcript
MAKING SURE YOUR FORMS DON'T SUCK @damian
None
None
None
ACCURATE FASTER CONFIDENT SATISFIED https://alistapart.com/article/inline-validation-in-web-forms
https://baymard.com/blog/inline-form-validation E-Commerce sites containing client side validation 40% 60%
https://baymard.com/blog/inline-form-validation E-Commerce sites containing client side validation 12% 40% 48%
THIS LEADS ME TO BELIEVE IT'S PURELY AN IMPLEMENTATION ISSUE
None
None
None
None
WHY IS IT SO HARD TO DO RIGHT?
BUILT TO BE UNRELIABLE
BUILT TO COMPLEMENT SERVER SIDE VALIDATION
ALIGN* AND SYNCHRONISE VALIDATIONS DECLARED ON THE SERVER
RECONCILE SERVER GENERATED VALIDATIONS WITH THOSE ON THE CLIENT
onKeypress - onChange - onBlur RECONCILE ERRORS MANIFESTED ACROSS DIFFERENT
EVENT PHASES
CONDITIONAL VALIDATIONS DEPENDANT ON OTHER FIELD VALUES
ASYNCHRONOUS VALIDATION
HOW DO WE FIX IT?
JUST BEING AWARE THAT SERVER SIDE VALIDATIONS EXIST
RECONCILE ERRORS MANIFESTED ACROSS DIFFERENT EVENT PHASES onKeypress - onChange
- onBlur
onKeypress - onChange - onBlur RECONCILE ERRORS MANIFESTED ACROSS DIFFERENT
EVENT PHASES
REACT CONCEPT OF INTERNAL STATE MANAGEMENT MAKES MORE SENSE AND
IS EASIER TO MANAGE
const fieldAlias = 'userLogin'; this.setState({ [fieldAlias]: { ...this.state[fieldAlias], value: changeFn('
[email protected]
'),
touched: true, } }, () => { Promise.all(validations.map((fn) => { return fn(this.state.values, this.serverErrors(), fieldAlias, 'onChange'); })) .then(() => { this.setValid() }) .catch((errors) => { this.setInvalid(errors) }); });
REMOVE 1 to 1 MAPPING BETWEEN FIELD VALUES AND VALIDATIONS
const validationFn = (values, serverErrors = {}, fieldUpdated, eventPhase) {
return new Promise((resolve, reject) => { const errors = {}; if (!values.userLogin) { errors.userLogin = 'Please enter your email address'; } Object.assign(errors, serverErrors); if (Object.keys(errors).length === 0) { return resolve(errors); } return reject(errors); }); }; CONDITIONAL VALIDATIONS DEPENDANT ON OTHER FIELDS
const SignInForm = ({ ...props }) => { const {
handleChange, handleBlur, form, method, fields, ...other } = props; const { userLogin, password } = form; return ( <form method={method} action="POST" {...other}> <input type="text" data-alias="userLogin" onChange={handleChange} onBlur={handleBlur} value={userLogin.value} /> {userLogin.touched && userLogin.errors.length > 0 && <span>{userLogin.errors}</span> } ... <button>Sign in</button> </form> ); }; export default conferizeForm(SignInForm, validationFn);
Consolidated event handling - either onChange or onBlur Conditional validations
Sync and async validations declared and resolved using Promise API Composable validations Developers own their form and it's fields Synchronising server and client side validations
MAKES USERS HAPPY BUT ONLY IF DONE RIGHT
REACT MAKES THAT A LOT EASIER
THE END