gpt4 book ai didi

javascript - React 中的只读字段是如何实现的?

转载 作者:搜寻专家 更新时间:2023-10-31 23:23:24 27 4
gpt4 key购买 nike

我把这个 SSCCE 放在一起来测试使用 ReactJS 创建的表单中的只读字段与纯 HTML 表单和字段(也在 jsfiddle 中):

<!doctype html>
<html>
<head>
<title>comparing ReactJS and simple HTML forms</title>
<script src="https://cdn.jsdelivr.net/react/0.14.0-rc1/react.js"></script>
<script src="https://cdn.jsdelivr.net/react/0.14.0-rc1/react-dom.js"></script>
</head>
<body>
<div>
<h3>HTML form</h3>
<form>
<input type='text' value='your name'/>
</form>
</div>
<div>
<h3>form created with ReactJS</h3>
<div id='reactForm'>
</div>
</div>
<script type='text/javascript'>
var rce = React.createElement.bind(React);

var SillyReactForm = React.createClass({
render: function() {
return rce('form', {}
, rce('input', { type: 'text', value:'your name'}));
}});
var form = rce(SillyReactForm, {});
ReactDOM.render(form, document.getElementById('reactForm'));
</script>
</body>
</html>

果然,用 ReactJS 创建的字段是只读的,事实上我在控制台中也看到了这条消息:

Warning: Failed form propType: You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.

我的问题是 ReactJS 是如何强制执行的,因为检查 DOM 元素我发现纯 HTML 表单和 ReactJS 生成的表单之间没有本质区别:

enter image description here

ReactJS 是否在执行一些幕后的 JavaScript,将该字段设置为有效的只读?如果是这样,我如何才能发现这种附加到我的 DOM 元素的逻辑?这是否与 ReactJS 是一个库而不是框架(因此更透明且更容易推理?)的想法背道而驰?

最佳答案

该警告并没有告诉您 React 强制输入为只读。它告诉你 React 不是。您最终会得到一个表示不可变状态的可变输入。用户将能够对输入进行更改,但一旦触发重新渲染,这些更改将丢失,因为输入是从应用程序状态重新生成的。

这就是 React 告诉您添加 readOnlyonChange 属性的原因。要么使输入不可变以与状态匹配,要么使状态可变以与输入匹配。

我以前没有使用过 defaultValue,但我想它是通过自动将 onChange 事件连接到幕后的某个状态来工作的。我认为如果省略 value 属性,React 可能也会做同样的事情,但如果 value 字段存在,则不会这样做,以免与任何状态绑定(bind)冲突在组件中,而是抛出此警告。

关于javascript - React 中的只读字段是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35794097/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com