React 的受控组件和非受控组件有什么不同

文章介绍了React中两种表单处理方式:受控组件,其值由组件state控制,保证数据一致性;非受控组件,状态由元素自身管理,减少不必要的重渲染。受控组件易于数据管理,但可能增加渲染成本;非受控组件则减少更新,适用于延迟更新场景。
摘要由CSDN通过智能技术生成

大家好,我是前端西瓜哥,今天我们来看看 React 的受控组件和非受控组件有什么不同。

受控组件

受控组件,指的是将表单元素的值交给组件的 state 来保存。

例子:

import './styles.css'
import { useState } from 'react'

const App = () => {
  const [val, setVal] = useState('前端西瓜哥')

  const sumbit = () => {
    // 直接拿组件 state
    const username = val
    // ...
  }

  return (
    <div>
      用户名:
      <input
        value={val}
        onInput={(e) => {
          setVal(e.target.value)
        }}
      />
      ...
    </div>
  )
}

我们用 value prop 控制着 input 元素的值,当发生输入事件时,我们将新值赋值给 val,然后 val 再通过 value 强制更新到 input。

这种写法,可以让 state 一直保持和 input 的内容相同,我们可以直接读取 state,将其传递给其他地方,比如通过 redux 去传递。

缺点是会进行组件的重渲染,一般来说表单元素并不复杂,重渲染成本不高,可以忽略不计。

非受控组件

非受控,就是指状态不由组件的 state 把持,而是让表单元素的内部控制着状态,在我们需要的时候再通过 element.value 的方式取出。

表单元素的初始值通过 defaultValue prop 来设置。

例子:

const App = () => {
  const ref = useRef(null)
  const sumbit = () => {
   	// 通过元素的引用取值
    const username = ref.current?.value
    // ...
  }

  return (
    <div>
      用户名:
      <input ref={ref} defaultValue="前端西瓜哥" />
      ...
    </div>
  )
}

优点是不会更新组件。缺点是不方便实时将值传给其他组件。

另外,它适合一种延迟更新状态的场景。比如输入一些内容,回车后失焦,发现格式不合法,就恢复为上一次的值。

结尾

受控组件和非受控组件,区别在于前者的表单状态由组件 state 控制,后者则是表单元素自己控制,要用时再读元素的值。

我是前端西瓜哥,欢迎关注我,学习更多前端知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值