关于 React Hook 可能出现的使用误区总结

请记住react 的公式: UI = f(state) ,这很重要。

useState


🌰示例1:useState 拆分过细

const [firstName, setFirstName] = useState();
const [lastName, setLastName] = useState();
const [school, setSchool] = useState();
const [age, setAge] = useState();
const [address, setAddress] = useState();

const [weather, setWeather] = useState();
const [room, setRoom] = useState(); 

较好解决方式✌: 适当的合并 state

学会归类这些状态。

firstName, lastName 均是用户的信息,可以放在一个 useState 进行管理。

const [userInfo, setUserInfo] = useState({firstName,lastName,school,age,address
});

const [weather, setWeather] = useState();
const [room, setRoom] = useState(); 

注意🎈:useState 的 set 动作永远是 替换 值。(React class 中的 this.setState 是会进行 合并 的)

在进行变更用户的某个信息例如 年龄 的时候记得带上之前的值。

setUserInfo((prevInfo) => ({...prevInfo,age: newAge
})) 

🌰示例2:多个状态实则只是一个状态的变形

doneSource 、doingSource 是 source 转变的。

const SomeComponent = (props) => {const [source, setSource] = useState([{type: 'done', value: 1},{type: 'doing', value: 2},])const [doneSource, setDoneSource] = useState([])const [doingSource, setDoingSource] = useState([])useEffect(() => {setDoingSource(source.filter(item => item.type === 'doing'))setDoneSource(source.filter(item => item.type === 'done'))}, [source])return (<div> ..... </div>)
} 

较好解决方式✌: 当一个状态可以被另外一个状态计算出来的话就不要去声明

const SomeComponent = (props) => {const [source, setSource] = useState([{type: 'done', value: 1},{type: 'doing', value: 2},])// 这里的 useMemo 视实际情况添加,通常不是需要大量的计算 react 是不建议使用 useMemoconst doneSource = useMemo(()=> source.filter(item => item.type === 'done'), [source]);const doingSource = useMemo(()=> source.filter(item => item.type === 'doing'), [source]);return (<div> ..... </div>)
} 

useRef


🌰示例1:多余的依赖

期望: 只有当 visible 变化时,弹出 Message 。

其中 text 、color 分别控制 弹窗的文案、背景颜色

function Demo(props) {const [visible, setVisible] = useState(false);const [text, setText] = useState('');const [color, setColor] = useState('red');useEffect(() => {Message(visible, text, color);}, [visible]);return (<div><buttononClick={() => setCount(visible =>!visible)}>click</button><input value={text} onChange={e => setText(e.target.value)} /><input value={color} onChange={e => setColor(e.target.value)} /></div>)
} 

如果你下载了 eslint-plugin-react-hooks插件的话,你会发现这行代码出现警告。

于是你在 effect deps 增加了 textcolor 依赖。

于是出现了一个问题,当 textcolor 发生变化的也会上传数据, 这并不符合我们的目标。

较好解决方式✌:善用 useRef

textcolor 改变的时候不需要重新更新视图的时候,尝试使用 useRef 去替代。

使用 useRef 去替换useState

function Demo(props) {const [visible, setVisible] = useState(false);const te
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值