react hooks学习篇(一)

125 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

一、useState

在函数组件里面我们使用useState来声明变量或是说添加状态。

const [count, setCount] = useState(0);
setCount(y => y + 1)

useState参数是定义初始的state,它返回值我们采用数组结构方式,一个是当前的state,一个是更新state的函数。

还有一个需要注意的点,useState 不会自动合并更新对象。你可以用函数式的 setState 结合展开运算符来达到合并更新对象的效果。

const [state, setState] = useState({});
setState(prevState => {
  // 也采用 Object.assign
  return {...prevState, ...updatedValues};
});

二、useEffect

你可以把 useEffect Hook 看做 componentDidMountcomponentDidUpdate 和 componentWillUnmount 这三个函数的组合。它会在第一次渲染之后和每次更新之后都执行。

useEffect(() => {
    console.log('执行useEffect。。。')
})

但是,在日常开发中每次渲染都会执行effect 可能会导致性能问题,这时我们会用到useEffect 的第二个可选参数。

useEffect(() => {
    console.log('执行useEffect。。。')
}, [ count ])

第二个参数是一个数组,你可以放入一个值、多个值 或者 是个空数组;当是空数组时只会在初始的时候执行,当有值的时候,只要一个更新了就会执行effect。

我们前面说过useEffect 也可以有类似 componentWillUnmount的功能,就需要你return一个函数,React 将会在执行清除操作时调用它。

useEffect(() => {
    console.log('执行useEffect。。。')
    return () => {
      console.log('清除执行effect。。。')
    }
}, [ count ])

三、useContext

Context 主要应用场景在于很多同层级的组件需要访问同样一些的数据,使用 context, 我们可以避免通过中间元素传递 props。

const value = useContext(MyContext); // MyContext是React.createContext 的返回值

当前的 context 值由上层组件中距离当前组件最近的 <MyContext.Provider> 的 value prop 决定。

import React, { useState, useEffect, useContext } from 'react';
import './App.css';

const MyContext = React.createContext('MyContext')

const Children = () => {
  return (
    <div>
      <Grandson />
    </div>
  )
}

const Grandson = () => {
  const context = useContext(MyContext)
  return (
    <div>
      我是useContext获取的值:{context}
    </div>
  )
}

function App() {
  const [count, setCount] = useState(0)
  console.log('render')
  useEffect(() => {
    console.log('useEffect')
    return () => {
      console.log('清楚执行effect')
    }
  }, [ count ])
  return (
    <div className="App">
      <header className="App-header">
        <h1>{count}</h1>
        <button onClick={() => setCount(x => x + 1)}>+1</button>
        <MyContext.Provider value='Hello MyContext'>
          <Children />
        </MyContext.Provider>
      </header>
    </div>
  );
}

export default App;

image.png 上面的例子把我们学习的三个hook都应用到了,通过这个例子也能够更好的理解、掌握。