在ReactJS中什么是受控组件和非受控组件?它们之间有什么不同?
当前回答
受控组件是从回调函数获取更改值的组件 而且 未受控组件是拥有来自DOM的组件。 例如, 当输入值发生变化时,我们可以使用受控组件中的onChange函数 我们也可以使用像ref这样的DOM来获取值。
其他回答
受控制的组件不保持它们的状态。
它们需要的数据从父组件传递给它们。
它们通过回调函数与这些数据交互,回调函数也从父进程传递给子进程。
受控组件是React中做事的首选方式。
它允许我们将所有组件的状态保持在React状态,而不是依赖DOM通过其内部状态来检索元素的值。
受控组件是从状态中派生其输入值的组件。
受控组件是从回调函数获取更改值的组件 而且 未受控组件是拥有来自DOM的组件。 例如, 当输入值发生变化时,我们可以使用受控组件中的onChange函数 我们也可以使用像ref这样的DOM来获取值。
它们都渲染表单元素
未受控组件和受控组件是用于描述呈现HTML表单元素的React组件的术语。每次创建渲染HTML表单元素的React组件时,都是在创建这两个元素中的一个。
非受控组件和受控组件访问表单元素数据的方式不同(<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表单元素的默认行为。
我们通过设置表单元素的属性值和事件onChange将表单元素(<input>, <textarea>或<select>)连接到状态来创建一个受控组件。
示例—受控组件:
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组件(表单元素)有关,React文档解释了其中的区别:
A Controlled Component is one that takes its current value through props and notifies changes through callbacks like onChange. A parent component "controls" it by handling the callback and managing its own state and passing the new values as props to the controlled component. You could also call this a "dumb component". A Uncontrolled Component is one that stores its own state internally, and you query the DOM using a ref to find its current value when you need it. This is a bit more like traditional 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>
在大多数(或所有)情况下,您应该使用受控组件。
推荐文章
- js:将一个组件包装成另一个组件
- 在typescript中一直使用。tsx而不是。ts有什么缺点吗?
- TypeScript React应用程序中的PropTypes
- {this.props是什么?孩子们,什么时候应该使用它?
- 反应。useState不会从props中重新加载状态
- 在Link react-router中传递道具
- React不会加载本地图像
- Axios获取url工作,但第二个参数作为对象,它不
- 我如何使用多个引用的元素与挂钩数组?
- 组件中useState对状态更新器的多次调用会导致多次重渲染
- 什么是useState()在React?
- 如何使webpack开发服务器运行在端口80和0.0.0.0使其公开访问?
- 无法找到模块“react-materialize”的声明文件。` path/to/module-name.js `隐式具有any类型
- 如何从子组件内部更新React上下文?
- 不能在呈现不同组件警告时更新组件