这个Demo中有两个 input,一个是 React组件中的input 一个是 通过document.createElement创建的input.
这两个input都设置了name和value. 他们之间的区别是:
第一个input无法输入,第二个input可以正常输入.
问题: 为什么会有这样的区别?
上面这段文字好像只在react中生效. 传统domAPI创建的input并没有这样的限制.
这个Demo中有两个 input,一个是 React组件中的input 一个是 通过document.createElement创建的input.
这两个input都设置了name和value. 他们之间的区别是:
第一个input无法输入,第二个input可以正常输入.
问题: 为什么会有这样的区别?
上面这段文字好像只在react中生效. 传统domAPI创建的input并没有这样的限制.
在React中,当你为<input>
元素设置了value
属性而没有同时设置onChange
事件处理器时,你会遇到输入字段无法被用户修改的情况。这是因为React的受控组件(controlled components)机制。
在React中,<input>
, <textarea>
, 和 <select>
元素等表单元素通常被称为“受控组件”,因为React通过其状态(state)来控制这些元素的值。当你为这些元素设置value
属性时,React会期望你通过某种方式(通常是onChange
事件)来更新这个值。
<input>
元素上设置value
属性并将其链接到组件的状态,并在onChange
事件处理器中更新这个状态来实现的。value
属性(或将其设置为undefined
),并允许浏览器处理输入来实现。然而,在React中,通常推荐使用受控组件,因为它们提供了更一致和可预测的行为。在你的例子中,React组件中的<input>
元素被赋予了value
属性,但没有提供onChange
事件处理器来更新这个值。因此,React会保持这个value
属性的值不变,即使DOM尝试更新它(例如,用户尝试输入文本)。这导致了一个看似“无法修改”的输入字段。
要使React中的<input>
元素可编辑,你需要添加一个onChange
事件处理器,该处理器会更新组件的状态,从而允许React知道何时应该更新DOM中的值。例如:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { value: '' };
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.setState({ value: event.target.value });
}
render() {
return <input type="text" value={this.state.value} onChange={this.handleChange} />;
}
}
在这个例子中,每当用户输入文本时,onChange
事件会被触发,handleChange
方法会被调用,该方法会更新组件的状态,从而允许<input>
元素显示新的值。
6 回答2.3k 阅读
3 回答2.1k 阅读✓ 已解决
2 回答2.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
React中受控组件的概念。会有一个自动处理,在每次输入后将输入框恢复到指定的
value
👉 <input> – React 中文文档
DOM元素会有一个内置的
value
属性,也就是我们经常会遇到的event.target.value
。和我们在React/Vue 中绑定的State
并不是同步的。一般都是需要我们去手动监听
input/change
事件来收集DOM元素的target.value
,然后赋值给绑定的state
。同理state
变更之后也需要去设置DOM元素的target.value
(只不过这一侧的修改多数都是由框架帮助实现了,Vue
是双向都自动处理了)。之前在
Vue
的社区中遇到一个类似的问题 👉 vue3中input的value和绑定的ref存在不同的问题 · vuejs/core · Discussion #7793 希望对你有帮助。当时我还写的一篇相关的笔记 👉 绑定的 value 值和元素的 value 值