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
230
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
330
Chrome DevTools tips and tricks
damian
0
190
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レビュー時代に必要なのは、SLOで引く撤退ライン
nobuoooo
0
150
AI時代の「OAuth認証」にどう物申すか?(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
340
暗号化?某ファイルストレージはどうなるの!? 3rd Partyとうまく付き合う秘密度ラベル設計
kasada
0
210
ブラウザで変わるID連携(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
350
AI駆動開発はどこまで来たのか? ファインディの最新実態調査で読み解く現在地 Devin Con Tokyo
akiratom
4
1.9k
1.5時間を無駄にして学んだwsl2におけるaptとsnapの選択と仕組み
yosaka0123
0
460
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
54k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
『自分で判断できるか』を基準に、プロダクトのハンズオン研修でAI利用の線を引いてみた / Where We Drew the Line on AI in Hands-on Training
honyanya
0
430
OpenID for Verifiable Credentials 実装から見えた相互運用性確保までの道のり(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
360
アクセスキーが漏れた日にやるべきこと- 無効化の先にある本当の対応
kazzpapa3
0
360
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
480
Featured
See All Featured
It's Worth the Effort
3n
188
29k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
The agentic SEO stack - context over prompts
schlessera
0
880
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
530
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
We Have a Design System, Now What?
morganepeng
55
8.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
480
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
Evolving SEO for Evolving Search Engines
ryanjones
0
270
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
630
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