受控组件和非受控组件

176 阅读1分钟

连续两次被问到,故学习下做记录
下面学习来自水哥和掘金文章


React中的组件分为将状态变化交由React处理的组件和通过ref引用获取的组件两种,前者称为受控组件,后者称为非受控组件,非受控组件的状态在组件自身存储,需要的时候通过ref查询DOM并查找其值。

受控组件:

  • 表单组件Input的值通过onChange回调交给React处理
  • React获取到表单的值(e.target.value)之后,将其保存到了状态变量name
  • 界面展示内容通过读取组件状态name,因此name的变化触发<div>hello {name}</div>的重新渲染

非受控组件:

  • React通过ref获取input元素的值

  • input值由用户改变,点击提交按钮,在handleSubmit中通过ref获取DOM元素,进而读取输入框的值

  • 输入框的变化并未交由组件控制,而是通过ref获取,也就是直接在DOM中读取

作者:卷帘依旧
链接:juejin.cn/post/702098…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

直接看代码最直观

export default function App() {
    const [num,setNum] = useState(0);
    const ref = useRef<HTMLInputElement>(null);

    return (
        <form>
            <input type="text" value={num} onChange={(e) => setNum(+e.target.value)} />
            <input type="text" defaultValue={num}  ref={ref}/>
            <button type="button" onClick={()=>{setNum(num+1)} }>点击</button>
            <button type="button" onClick={()=>{console.log(ref.current?.value)}}>打印非受控组件值</button>
        </form>

    )
}

当然要获取受控组件的值可以直接打印null

非受控组件则需要用到ref获取dom来打印(如代码所示)