在ReactJS中,什么是受控组件和非受控组件?它们之间有何不同之处?
这与有状态的DOM组件(表单元素)有关,React文档解释了其中的区别:
props
来取得其当前值,并通过诸如 onChange
的回调通知更改。父组件通过处理回调并管理自己的状态,将新值作为 props 传递给受控组件来“控制”它。你也可以称之为“哑组件”。ref
查询 DOM 来查找其当前值。这有点类似于传统的 HTML。大多数本地 React 表单组件都支持受控和非受控用法:
// Controlled:
<input type="text" value={value} onChange={handleChange} />
// Uncontrolled:
<input type="text" defaultValue="foo" ref={inputRef} />
// Use `inputRef.current.value` to read the current value of <input>
在大多数(或所有)情况下,您应该使用受控组件。
Uncontrolled component 和 Controlled component 是用于描述渲染 HTML 表单元素 的 React 组件的术语。每次你创建一个渲染 HTML 表单元素的 React 组件时,你就创建了其中之一。
Uncontrolled component 和 Controlled component 在访问表单元素 (<input>
, <textarea>
, <select>
) 中的数据的方式上有所不同。
未受控制的组件 是指渲染表单元素的组件,其中表单元素的数据由 DOM 处理(默认 DOM 行为)。要访问输入框的 DOM 节点并提取其值,可以使用 ref。
const { useRef } from 'react';
function Example () {
const inputRef = useRef(null);
return <input type="text" defaultValue="bar" ref={inputRef} />
}
一个 受控组件 是指渲染表单元素并通过将表单数据存储在组件状态中来控制它们的组件。
在 受控组件 中,表单元素的数据由 React 组件(而不是 DOM)处理并保存在 组件状态 中。受控组件基本上重写了 HTML 表单元素的默认行为。
我们通过设置其属性 value
和事件 onChange
将表单元素 (<input>
, <textarea>
或 <select>
) 与 state 相连来创建受控组件。
const { useState } from 'react';
function Controlled () {
const [email, setEmail] = useState();
const handleInput = (e) => setEmail(e.target.value);
return <input type="text" value={email} onChange={handleInput} />;
}
被控制的组件是从回调函数获取更改值的组件,而不受控制的组件是具有来自DOM的值的组件。
例如,当输入值改变时,我们可以在受控制的组件中使用onChange函数来获取值,也可以像ref一样使用DOM来获取值。
https://www.youtube.com/watch?v=6L2Rd116EvY 你可以查看这个页面,他很好地解释了它......
不用复杂的词语,受控组件是渲染表单元素(如<input/>
)的组件,其值由React独自控制。例如,复制下面的代码并尝试更改DOM中的输入字段...
export default function Component() {
return (
<div>
<input type="text" value="somevalue" />
</div>
)
}
function Component() {
const [text,setText] = React.useState("")
return (
<div>
<input type="text" onChange={(e)=>setText(e.target.value)} value={text} />
<p>{text}</p>
</div>
)
}
现在我们的输入可以被更新,它的值可以用于渲染或者执行即时验证......
非受控组件是渲染表单元素(比如 <input/>
)的组件,其值可以由 Dom 元素处理。而受控和非受控之间的一个主要区别就是 value 属性的定义。对于非受控组件,我们使用 defaultValue
或者有时候根本没有值。
function Component() {
return (
<div>
<input type="email" id="message" defaultValue="example@mail.com" />
</div>
)
}
上述输入框的值可以通过DOM进行更改控制,无需使用React...
建议在React中更多地使用受控组件,因为您可以执行即时验证并强制实现动态输入。
受控组件不持有它们的状态。
所需数据从父组件传递给它们。
它们通过回调函数与该数据交互,这些回调函数也是从父组件传递给子组件的。
控制组件是React中推荐的一种做法。
它允许我们将所有组件状态都保存在React状态中,而不是依靠DOM通过其内部状态获取元素的值。
控制组件是从状态派生其输入值的组件。
受控组件主要是指组件的任何属性值都来自于父组件或存储中的值(例如redux中的情况)。例如:
<ControlledComp value={this.props.fromParent}/>
在无控制组件的情况下,组件的值可以根据事件处理从组件的状态中获取。例如:
<UncontrolledComp value={this.state.independentValue}/>
props
,而是通过state
吗? - Ivanka Todorovaprops
传递。而不受控制的组件则使用state
在内部控制值本身。这是关键区别。 - Aaron Beall<input type="text" value="value" onChange={handleChangeCallbackFn} />
),而传统的HTML中,输入元素处理自己的值,并且可以通过称为“未受控组件”的refs
进行读取(<value type="text" />
)。受控组件通过setState
管理自身状态或从其父组件作为属性获取状态。 - Lior Elrom