React-Hooks

895 阅读2分钟

useRef

useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。返回的 ref 对象在组件的整个生命周期内保持不变。

创建调用useRef挂钩的时候给默认值null很重要,因为React.useRef只能为null或者element对象

import React, {useRef} from "react";

const Login = observer(() => {
    const {AuthStore} = useStore();
    const container = useRef(null);
    console.log(container)  // null
    
    const newText = (e)=>{
        console.log(container.current)  // <input type="text">
    }

    return (
      <Layout>
        <h3>{AuthStore.values.userName}</h3>
        <input type='text' onChange={newText} ref={container}/>
      </Layout>
    );
  }

useState

返回一个 state,以及更新 state 的函数。

在初始渲染期间,返回的状态 (state) 与传入的第一个参数 (initialState) 值相同。

setState 函数用于更新 state。它接收一个新的 state 值并将组件的一次重新渲染加入队列。

用法:

const [n.setN] = useState(0) // 0作为默认值传进去

值得注意的是,react不应允许我们擅自修够n的值,需要重新创建一个值,在渲染值前,去读取最新的n值,在渲染到界面上, 注意

与 class 组件中的 setState 方法不同,useState 不会自动合并更新对象。你可以用函数式的 setState 结合展开运算符来达到合并更新对象的效果。

setState(prevState => {
  // 也可以使用 Object.assign
  return {...prevState, ...updatedValues};
});

useReducer 是另一种可选方案,它更适合用于管理包含多个子值的 state 对象。

useEffect

该 Hook 接收一个包含命令式、且可能有副作用代码的函数。//官方解释

类似于class类写法中的生命周期钩子

useEffect(fn,deps) // 参数接受一个函数,和一个数组

与钩子做一个比较

useEffect(()=>{},[]) // 第二个参数数组为空,
//相似
ComponentDidMount // 将要挂载页面时

//值得注意的是,ComponentDidUpdate只在数据更新的时候去执行,而useEffect在依赖产生变化的是后更新之外,也会在页面初始化的时候更新,

useEffect(()=>{},[x]) // 如果有依赖,
//相似
ComponentDidUpdate

useContenxt

接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值。当前的 context 值由上层组件中距离当前组件最近的 <MyContext.Provider> 的 value prop 决定。

cosnt x = createContext()

<x.provider value=''>
   <ChildrenComponents/>
</x.prvider>

const ChildrenComponents = (x)=。{
    cosnt y = useContext
}

别忘记 useContext 的参数必须是 context 对象本身:

//如同上面的x

  • 正确: useContext(MyContext)
  • 错误: useContext(MyContext.Consumer)
  • 错误: useContext(MyContext.Provider)

自定义Hooks

自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他的 Hook。

//重点必须是use开头的函数

cosnt useName = ()=>{
const friendList = [
  { id: 1, name: 'Phoebe' },
  { id: 2, name: 'Rachel' },
  { id: 3, name: 'Ross' },
];
    cosnt [name,setName] = useState(friendList)
    
    setUser = (obj)=>{
        setName([...name,...obj])
    }
    
    return {setUser}
}
const Home = ()=>{
    cosnt {setUser} = useName()
    onClick = ()=>{
     setUser({id:4,name:'x'})
    }
}