Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keep value of controlled number fields upon action #30737

Closed
wants to merge 3 commits into from

Conversation

vordgi
Copy link

@vordgi vordgi commented Aug 17, 2024

Summary

Currently, React changes the defaultValue for number fields not on every change, but on blur. The reasons are described in issue #7253.

Now this bug is not reproducible in Chrome. Just to be sure, I checked that it was fixed specifically in Chrome, and not with some React update (I ran React v15.2 in modern Chrome and there were no issues from the task there either).

I extended the EventPlugin, making the replacement of defaultValue not only on blur, but also on submit (since you can press Enter without leaving the field and the form will be submitted). But I did it specifically on the keypress event, so that it works before reset and on the submit itself without a submitter (this is, for example, when calling requestSubmit()).

Added a "force" option in setDefaultValue, because a numeric field can be in focus (and on submit, the value needs to be changed always).

I honestly tried to cover this with tests, but couldn't find a way to trigger submit by simulating a key press...

Fixes #29862
Closes #29862

How did you test this change?

Before fix:

react_number_on_action_before.mp4

After fix:

react_number_on_action_after.mp4

Copy link

vercel bot commented Aug 17, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
react-compiler-playground ✅ Ready (Inspect) Visit Preview 💬 Add feedback Aug 19, 2024 4:04pm

@vordgi
Copy link
Author

vordgi commented Aug 17, 2024

Fixes #29862
Closes #29862

@sebmarkbage
Copy link
Collaborator

This makes sense to me but maybe needs another pair of eyes. I'm not sure this is exhaustive since you can trigger actions and resets in arbitrary way - such as based on a different keystroke.

Ideally maybe it would sync it right before resetting.

@react-sizebot
Copy link

Comparing: 0fa9476...8450b29

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.js = 6.68 kB 6.68 kB +0.05% 1.82 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js +0.03% 500.37 kB 500.54 kB +0.04% 89.80 kB 89.83 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.69 kB 6.69 kB = 1.83 kB 1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js +0.03% 507.50 kB 507.67 kB +0.04% 90.96 kB 91.00 kB
facebook-www/ReactDOM-prod.classic.js +0.03% 595.24 kB 595.41 kB +0.04% 105.55 kB 105.59 kB
facebook-www/ReactDOM-prod.modern.js +0.03% 571.54 kB 571.71 kB +0.04% 101.75 kB 101.79 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js = 101.60 kB 101.38 kB = 20.59 kB 20.55 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js = 101.57 kB 101.35 kB = 20.60 kB 20.56 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.unbundled.production.js = 100.63 kB 100.41 kB = 20.33 kB 20.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.js = 100.61 kB 100.39 kB = 20.33 kB 20.28 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js = 94.96 kB 94.74 kB = 19.45 kB 19.40 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js = 98.60 kB 98.36 kB = 19.92 kB 19.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js = 98.57 kB 98.33 kB = 19.92 kB 19.88 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js = 98.47 kB 98.23 kB = 19.89 kB 19.85 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js = 98.15 kB 97.91 kB = 19.80 kB 19.75 kB
oss-stable-rc/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js = 77.59 kB 77.39 kB = 16.51 kB 16.48 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js = 77.59 kB 77.39 kB = 16.51 kB 16.48 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js = 77.59 kB 77.39 kB = 16.51 kB 16.48 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js = 302.70 kB 301.73 kB = 57.10 kB 56.99 kB
oss-experimental/react-server/cjs/react-server-flight.production.js = 63.36 kB 63.15 kB = 12.48 kB 12.45 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js = 91.19 kB 90.78 kB = 17.24 kB 17.19 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js = 91.19 kB 90.78 kB = 17.24 kB 17.19 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js = 91.19 kB 90.78 kB = 17.24 kB 17.19 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js = 88.72 kB 88.32 kB = 17.01 kB 16.97 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js = 88.72 kB 88.32 kB = 17.01 kB 16.97 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js = 88.72 kB 88.32 kB = 17.01 kB 16.97 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js = 88.70 kB 88.31 kB = 17.03 kB 16.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js = 88.70 kB 88.31 kB = 17.03 kB 16.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js = 88.70 kB 88.31 kB = 17.03 kB 16.99 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js = 90.39 kB 89.99 kB = 17.07 kB 17.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js = 90.39 kB 89.99 kB = 17.07 kB 17.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js = 90.39 kB 89.99 kB = 17.07 kB 17.01 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js = 87.33 kB 86.94 kB = 16.74 kB 16.70 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js = 87.33 kB 86.94 kB = 16.74 kB 16.70 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js = 87.33 kB 86.94 kB = 16.74 kB 16.70 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js = 86.52 kB 86.13 kB = 16.58 kB 16.53 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js = 86.52 kB 86.13 kB = 16.58 kB 16.53 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js = 86.52 kB 86.13 kB = 16.58 kB 16.53 kB
oss-stable-rc/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js = 85.11 kB 84.72 kB = 16.27 kB 16.22 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js = 85.11 kB 84.72 kB = 16.27 kB 16.22 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js = 85.11 kB 84.72 kB = 16.27 kB 16.22 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js = 82.47 kB 82.08 kB = 15.53 kB 15.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js = 82.47 kB 82.08 kB = 15.53 kB 15.49 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js = 82.47 kB 82.08 kB = 15.53 kB 15.49 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js = 82.02 kB 81.62 kB = 15.41 kB 15.37 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js = 82.02 kB 81.62 kB = 15.41 kB 15.37 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js = 82.02 kB 81.62 kB = 15.41 kB 15.37 kB
oss-stable-rc/react-client/cjs/react-client-flight.development.js = 81.73 kB 81.34 kB = 14.83 kB 14.79 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js = 81.73 kB 81.34 kB = 14.83 kB 14.79 kB
oss-stable/react-client/cjs/react-client-flight.development.js = 81.73 kB 81.34 kB = 14.83 kB 14.79 kB
oss-stable-rc/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js = 80.01 kB 79.62 kB = 15.02 kB 14.98 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js = 80.01 kB 79.62 kB = 15.02 kB 14.98 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js = 80.01 kB 79.62 kB = 15.02 kB 14.98 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js = 56.85 kB 56.56 kB = 11.56 kB 11.53 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js = 56.85 kB 56.56 kB = 11.56 kB 11.53 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js = 56.85 kB 56.56 kB = 11.56 kB 11.53 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js = 56.17 kB 55.87 kB = 11.39 kB 11.37 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js = 56.17 kB 55.87 kB = 11.39 kB 11.37 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js = 56.17 kB 55.87 kB = 11.39 kB 11.37 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js = 54.42 kB 54.13 kB = 11.26 kB 11.23 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js = 54.42 kB 54.13 kB = 11.26 kB 11.23 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js = 54.42 kB 54.13 kB = 11.26 kB 11.23 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js = 54.41 kB 54.12 kB = 11.27 kB 11.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js = 54.41 kB 54.12 kB = 11.27 kB 11.24 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js = 54.41 kB 54.12 kB = 11.27 kB 11.24 kB
oss-stable-rc/react-server/cjs/react-server-flight.development.js = 88.99 kB 88.52 kB = 16.41 kB 16.36 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js = 88.99 kB 88.52 kB = 16.41 kB 16.36 kB
oss-stable/react-server/cjs/react-server-flight.development.js = 88.99 kB 88.52 kB = 16.41 kB 16.36 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js = 53.27 kB 52.98 kB = 11.04 kB 11.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js = 53.27 kB 52.98 kB = 11.04 kB 11.01 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js = 53.27 kB 52.98 kB = 11.04 kB 11.01 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js = 52.57 kB 52.28 kB = 10.89 kB 10.86 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js = 52.57 kB 52.28 kB = 10.89 kB 10.86 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js = 52.57 kB 52.28 kB = 10.89 kB 10.86 kB
oss-stable-rc/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js = 51.31 kB 51.02 kB = 10.61 kB 10.58 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js = 51.31 kB 51.02 kB = 10.61 kB 10.58 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js = 51.31 kB 51.02 kB = 10.61 kB 10.58 kB
oss-stable-rc/react-client/cjs/react-client-flight.production.js = 53.04 kB 52.73 kB = 9.79 kB 9.76 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js = 53.04 kB 52.73 kB = 9.79 kB 9.76 kB
oss-stable/react-client/cjs/react-client-flight.production.js = 53.04 kB 52.73 kB = 9.79 kB 9.76 kB
oss-stable-rc/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js = 49.00 kB 48.71 kB = 10.06 kB 10.02 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js = 49.00 kB 48.71 kB = 10.06 kB 10.02 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js = 49.00 kB 48.71 kB = 10.06 kB 10.02 kB
oss-stable-rc/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js = 48.67 kB 48.37 kB = 9.97 kB 9.93 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js = 48.67 kB 48.37 kB = 9.97 kB 9.93 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js = 48.67 kB 48.37 kB = 9.97 kB 9.93 kB
oss-stable-rc/react-server/cjs/react-server-flight.production.js = 58.37 kB 58.01 kB = 11.63 kB 11.60 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.js = 58.37 kB 58.01 kB = 11.63 kB 11.60 kB
oss-stable/react-server/cjs/react-server-flight.production.js = 58.37 kB 58.01 kB = 11.63 kB 11.60 kB
oss-stable-rc/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js = 47.06 kB 46.76 kB = 9.60 kB 9.56 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js = 47.06 kB 46.76 kB = 9.60 kB 9.56 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js = 47.06 kB 46.76 kB = 9.60 kB 9.56 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js = 124.85 kB 124.06 kB = 29.16 kB 29.01 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js = 57.54 kB 57.04 kB = 11.67 kB 11.59 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js = 56.85 kB 56.35 kB = 11.51 kB 11.43 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js = 99.54 kB 98.66 kB = 18.95 kB 18.81 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js = 98.74 kB 97.86 kB = 18.77 kB 18.63 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js = 96.94 kB 96.07 kB = 18.64 kB 18.51 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js = 96.92 kB 96.06 kB = 18.65 kB 18.53 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js = 95.56 kB 94.69 kB = 18.42 kB 18.29 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.development.js = 94.75 kB 93.88 kB = 18.25 kB 18.12 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js = 55.14 kB 54.63 kB = 11.37 kB 11.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js = 55.13 kB 54.62 kB = 11.38 kB 11.30 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js = 93.33 kB 92.47 kB = 17.95 kB 17.82 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js = 53.98 kB 53.48 kB = 11.15 kB 11.08 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.unbundled.production.js = 53.28 kB 52.78 kB = 10.99 kB 10.92 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js = 90.69 kB 89.83 kB = 17.16 kB 17.04 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js = 90.24 kB 89.37 kB = 17.05 kB 16.93 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js = 52.03 kB 51.52 kB = 10.71 kB 10.64 kB
oss-experimental/react-client/cjs/react-client-flight.development.js = 90.00 kB 89.12 kB = 16.48 kB 16.37 kB
oss-experimental/react-client/cjs/react-client-flight.production.js = 53.65 kB 53.13 kB = 9.89 kB 9.81 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js = 88.39 kB 87.52 kB = 16.66 kB 16.53 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js = 78.92 kB 78.12 kB = 16.72 kB 16.58 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js = 49.71 kB 49.21 kB = 10.17 kB 10.10 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js = 49.38 kB 48.87 kB = 10.08 kB 10.01 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js = 47.77 kB 47.27 kB = 9.71 kB 9.64 kB

Generated by 🚫 dangerJS against 695b016

@sophiebits
Copy link
Collaborator

I don't really like doing it in keypress, that seems too clever given that it's not exhaustive… should we do it in the submit event handler only?

@vordgi
Copy link
Author

vordgi commented Aug 20, 2024

Working on another solution with more changes

@vordgi
Copy link
Author

vordgi commented Aug 20, 2024

Opened a new PR with different solution (which I think is more correct) - #30752

@vordgi
Copy link
Author

vordgi commented Aug 21, 2024

Closing this, as there is a more suitable solution in #30752

@vordgi vordgi closed this Aug 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[React 19] Controlled number input does not update defaultValue when value prop has changed
5 participants