React中受控组件和非受控组件

简介: React中受控组件和非受控组件

非受控组件



首先,我们创建了一个input表单。当我们启动我们的应用的时候,你可以向Input表单里面输入任何值并且可以看到变化,即使我们没有给任何的处理函数在我们的代码中。因为这是Html的原生事件,它管理着自己的内部状态。


import React from 'react';
const App = () => (
  <div>
    <label>
      My uncontrolled Input: <input type="text" />
    </label>
  </div>
);
export default App;

image.png

非受控组件 VS 受控组件



当我们在这个例子中引入React State和Hooks时。


import React, { useState } from 'react';
const App = () => {
  const [value, setValue] = useState('');
  const handleChange = event => setValue(event.target.value);
  return (
    <div>
      <label>
        My still uncontrolled Input:
        <input type="text" onChange={handleChange} />
      </label>
      <p>
        <strong>Output:</strong> {value}
      </p>
    </div>
  );
};
export default App;

运行效果如下

image.png


现在,我们可以看到当我们更改input表单里面的值时,输出的value值也会相应的产生变化。这时候我们问一下自己,这个为什么还是非受控组件呢?


先别急,我们来看下一个例子


import React, { useState } from 'react';
const App = () => {
  const [value, setValue] = useState('Hello React');
  const handleChange = event => setValue(event.target.value);
  return (
    <div>
      <label>
        My still uncontrolled Input:
        <input type="text" onChange={handleChange} />
      </label>
      <p>
        <strong>Output:</strong> {value}
      </p>
    </div>
  );
};
export default App;

代码运行效果


image.png


你能发现这个例子和上面那个例子有什么不同的地方吗?在这个例子中,我们给了value一个初始值"hello react"。但是我们可以发现,当我们启动应用的时候,input表单里面的值依旧为空。只有我们开始输入的时候,input表单和output才似乎开始同步。这里为什么要用似乎呢?其实,Input表单中的字段实际上还是跟踪的是它自己的内部状态,然而output跟踪的React中state的值,他们能够同步是靠handleChange函数。这就是为什么启动时他们的值不一样的原因了。


从非受控组件到受控组件


当我们将input表单中value值与React中的state进行绑定,input表单就不会使用它内部的状态,而是你提供的state值。当我们现在向input表单中输入值的时候,表单的字段和输出的值就会同步更新拉。这个表单已经从非受控组件变成了受控组件。


import React, { useState } from 'react';
const App = () => {
  const [value, setValue] = useState('Hello React');
  const handleChange = event => setValue(event.target.value);
  return (
    <div>
      <label>
        My controlled Input:
        <input type="text" value={value} onChange={handleChange} />
      </label>
      <p>
        <strong>Output:</strong> {value}
      </p>
    </div>
  );
};
export default App;

image.png

目录
相关文章
|
24天前
|
前端开发
React函数式组件props的使用(六)
【8月更文挑战第14天】React函数式组件props的使用(六)
26 1
React函数式组件props的使用(六)
|
9天前
|
消息中间件 前端开发
React技术栈-组件间通信的2种方式
本文介绍了React技术栈中组件间通信的两种方式:通过props传递数据和使用消息发布(publish)-订阅(subscribe)机制,并通过实例代码展示了如何使用PubSubJS库实现跨组件通信。
36 11
React技术栈-组件间通信的2种方式
|
9天前
|
前端开发 Python
React技术栈-React路由插件之自定义组件标签
关于React技术栈中React路由插件自定义组件标签的教程。
34 4
React技术栈-React路由插件之自定义组件标签
|
22天前
|
存储 前端开发 JavaScript
React的受控组件与非受控组件(九)
【8月更文挑战第15天】React的受控组件与非受控组件
25 2
React的受控组件与非受控组件(九)
|
24天前
|
前端开发 JavaScript
React类组件props的使用(五)
【8月更文挑战第14天】React类组件props的使用(五)
38 1
React类组件props的使用(五)
|
24天前
|
前端开发
React组件实例更改state状态值(四)
【8月更文挑战第14天】React组件实例更改state状态值(四)
25 1
React组件实例更改state状态值(四)
|
12天前
|
前端开发 JavaScript
React 组件生命周期方法详解
【8月更文挑战第30天】
28 1
|
15天前
|
存储 前端开发 JavaScript
React Hooks的魔法:如何在组件世界里施展响应式与复用的魔法
【8月更文挑战第27天】React Hooks 是自 React 16.8 起新增的功能,支持开发者在无需类组件的情况下利用 React 的状态管理和特性。本文通过实例展示了多种核心 Hooks 的使用方法:`useState` 用于实现响应式状态管理;`useEffect` 处理副作用操作,如数据获取等;`useMemo` 和 `useCallback` 有助于性能优化;`useRef` 则提供对 DOM 的直接引用。
26 2
|
24天前
|
JavaScript 前端开发 容器
React组件属性refs(七)
【8月更文挑战第14天】React组件属性refs(七)
44 0
React组件属性refs(七)
|
11天前
|
前端开发 UED 开发者
React组件优化全攻略:深度解析让你的前端应用飞速运行的秘诀——从PureComponent到React.memo的彻底性能比较
【8月更文挑战第31天】在构建现代Web应用时,性能是提升用户体验的关键因素。React作为主流前端库,其组件优化尤为重要。本文深入探讨了React组件优化策略,包括使用`PureComponent`、`React.memo`及避免不必要的渲染等方法,帮助开发者显著提升应用性能。通过实践案例对比优化前后效果,不仅提高了页面渲染速度,还增强了用户体验。优化React组件是每个开发者必须关注的重点。
22 0