关于html:React-受控组件Hooks-方式

43次阅读

共计 2975 个字符,预计需要花费 8 分钟才能阅读完成。

作者:Shadeed
译者:前端小智
起源:dmitripavlutin

点赞再看 ,微信搜寻【大迁世界】,B 站关注【前端小智】 这个没有大厂背景,但有着一股向上踊跃心态人。本文 GitHub https://github.com/qq44924588… 上曾经收录,文章的已分类,也整顿了很多我的文档,和教程材料。

最近开源了一个 Vue 组件,还不够欠缺,欢送大家来一起欠缺它,也心愿大家能给个 star 反对一下,谢谢各位了。

github 地址:https://github.com/qq44924588…

React 提供了两种办法来拜访 input 字段的值: 应用受控或非受控组件。我更喜爱受控组件,因为咱们能够通过组件的状态读取和设置 input 的值。

在这篇文章中,咱们来看看如何应用 React Hook 实现受控组件。

1. 受控组件

假如咱们有一个简略的文本字段,并且想拜访其值:

import {useState} from 'react';

function MyControlledInput({}) {const [ value, setValue] = useState('');
  const onChange = (event) => {setValue(event.target.value);
  }
  
  return (
    <>
        <div>Input value: {value}</div>
        <input value={value} onChange={onChange} />
    </>
  )
}

关上示例 (https://codesandbox.io/s/cont…。能够看到 value 变量蕴含input 字段中的值,并且在每次输出新值时,它也会更新。

input字段受到管制,因为 React 从状态 <input value = {value} ... /> 设置其值。当用户在 input 中输出内容时,onChange 处理程序会应用从事件对象 event.target.value 拜访的输出值来更新状态。

value变量示意用户实在输出的值。每次须要拜访用户在 input 字段中输出的值时,只需读取 value 状态变量。

受控组件办法能够帮忙咱们拜访任何输出类型的值: 惯例文本输出、textareaselect 等。

2. 受控组件中的 3 个步骤中

设置受控组件须要 3 个步骤:

  1. 定义保留 input 值的状态:const [value, setValue] = useState(")
  2. 创立事件处理程序,该事件处理程序在值更改时更新状态:
const onChange = event => setValue(event.target.value);

3. 为 input 字段调配状态值,并增加事件处理程序:<input type="text" value={value} onChange={onChange} />

3. state 作为实在的数组源

咱们看一个更简单的例子。页面中有一组员工姓名列表。咱们须要增加一个 input字段,当用户在此字段中键入内容时,员工列表将按姓名进行过滤。

function FilteredEmployeesList({employees}) {const [query, setQuery] = useState('');  
 const onChange = event => setQuery(event.target.value);
  const filteredEmployees = employees.filter(name => {return name.toLowerCase().includes(query.toLowerCase());
  });

  return (
    <div>
 <h2>Employees List</h2>
 <input 
        type="text" 
 value={query}        onChange={onChange}      />
 <div className="list">
 {filteredEmployees.map(name => <div>{name}</div>)}
 </div>
 </div>
  );
}

关上演示(https://codesandbox.io/s/grac…,能够自行试试。

对输出进行防抖

在后面的实现中,只有在 input 中输出一个字符,就会立刻过滤列表。这并不总是很不便,因为在输出查问时它会扩散用户的注意力。

咱们通过 debounce 来改善用户体验:在最初一次更改后,以 400 毫秒的提早过滤列表。

import {useDebouncedValue} from './useDebouncedValue';
function FilteredEmployeesList({employees}) {const [query, setQuery] = useState('');
 const debouncedQuery = useDebouncedValue(query, 400);  
  const onChange = event => setQuery(event.target.value);

  const filteredEmployees = employees.filter(name => {return name.toLowerCase().includes(debouncedQuery.toLowerCase());  });

  return (
    <div>
 <h2>Employees List</h2>
 <input 
        type="text" 
        value={query} 
        onChange={onChange}
      />
 <div className="list">
 {filteredEmployees.map(name => <div>{name}</div>)}
 </div>
 </div>
  );
}

关上演示 (https://codesandbox.io/s/affe…,而后在input 中输放值进行查问。员工列表不会在你打字时进行过滤,而是在最近一次按下键 400 毫秒后进行过滤。

上面是 useDebouncedValue() 的实现

export function useDebouncedValue(value, wait) {const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {const id = setTimeout(() => setDebouncedValue(value), wait);
    return () => clearTimeout(id);
  }, [value]);

  return debouncedValue;
}

受控组件是拜访 React 中 input 字段的值的一种不便的技术。它不应用援用,而是作为拜访 input 值的繁多实在源。

~ 完,咱们小智,我要去刷碗了,下期再见~


代码部署后可能存在的 BUG 没法实时晓得,预先为了解决这些 BUG,花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。

原文:https://dmitripavlutin.com/co…

交换

文章每周继续更新,能够微信搜寻「大迁世界」第一工夫浏览和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 曾经收录,整顿了很多我的文档,欢送 Star 和欠缺,大家面试能够参照考点温习,另外关注公众号,后盾回复 福利,即可看到福利,你懂的。

正文完
 0