Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
覗いてみよう 関数型ビジュアル言語×2Dグラフィックスの世界
yohyamasaki
0
150
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
300
Swap and Memory Reclaim - Squeezing Out More RAM
ennael
PRO
1
1k
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
250
【Findyテック文化祭ワークショップ】新卒エンジニア&採用担当と作る、 なりたい姿と今やるべき一歩
dip_tech
PRO
0
150
IR Today: Theory, Practice, and Agents
dtunkelang
0
240
エージェントはローカル、検証はMicroVM — Lambda MicroVMsでつくるServerless CI
fujioka6789
4
870
企業の現実世界をグラフで写し取る
sansantech
PRO
0
190
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
180
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
190
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
PQC移行の今 -- IETF からみた現在地
satokan
4
630
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
560
How to build a perfect <img>
jonoalderson
1
6k
Building an army of robots
kneath
307
47k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
420
GitHub's CSS Performance
jonrohan
1033
470k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
Deep Space Network (abreviated)
tonyrice
0
330
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.1k
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