React Hooks方法

1.useState

 

import React, { useState } from "react";

/* 
    目标:
        掌握useState的使用

        作用:实现响应式数据的
        用法:引入,useState构造响应式数据
          const [val,修改val的函数]=useState(val的初始值)

          注意点:
          1.hook都必须是以use开头的
          2.必须在函数的最顶层使用

*/

export default function App() {
  const [user, setUser] = React.useState({ name: "Jack", age: 18 });
  const onClick = () => {
    //setUser不可以局部更新,如果只改变其中一个,那么整个数据都会被覆盖
    // setUser({
    // name: 'Frank'
    // })
    setUser({
      ...user, //拷贝之前的所有属性
      name: "Frank", //这里的name覆盖之前的name
    });
  };
  return (
    <div className="App">
      <h1>{user.name}</h1>
      <h2>{user.age}</h2>
      <button onClick={onClick}>Click</button>
    </div>
  );
}

 

注意事项:
地址要进行改变
setState(obj) 如果obj地址不变,那么React就认为数据没有变化,不会更新视图

 

2.useEffect

// 副作用hook用来处理一些React之外的事件
//但是其实EffectHook最常见的使用场景是模拟生命周期
// 用法:当useEffect依赖的数据发生变化,就会调用回调函数
// useEffect(回调函数,[依赖的数据])
import React, { useEffect, useState } from "react";

export default function EffectHook() {
  const [val, setVal] = useState(0);
  // 当前这个用法,模拟了componentDidUpdated这个生命周期
  //   useEffect(() => {
  //     console.log(1);
  //   }, [val]);
  //   setInterval(() => {
  //     setVal(val + 1);
  //   }, 1000);

  // 使用useEffect模拟componentDidMount
  //   useEffect(() => {
  //     //该回调函数会在第一次渲染的时候调用一次
  //     console.log(3);
  //   }, []);

  useEffect(() => {
    // 在回调函数里面返回一个函数
    return () => {
      console.log("卸载");
    };
  }, []);
  return <div></div>;
}

 

3.useContext

 

import React, { useState, createContext, useContext } from "react";

/* 
    目标:
        学会使用useContext 使用context进行多级组件传递数据

        用法:
            1.createContext
            2.Provider
            3.useContext
                const data=useContext(MyContext)
                data为 Provider给的value的值
                MyContext为在第一步创建的context的变量

*/

// 1.创建一个context
const MyContext = createContext();

export default function ContextStudy() {
  const [count, setCount] = useState(5);
  const add = () => {
    setCount(count + 1);
  };
  // 2.需要一个Provider
  return (
    <MyContext.Provider value={{ count, add }}>
      <Parent></Parent>
    </MyContext.Provider>
  );
}

function Parent() {
  return <Child></Child>;
}

function Child() {
  const data = useContext(MyContext);
  console.log(data);
  return (
      <div>
          <h3>孙子</h3>
          <p>{data.count}</p>
          <button onClick={data.add}>++</button>
      </div>
  )
}

 

4.useReducer

import React, { useReducer, useState } from "react";
/*
    目标:
        掌握 ReducerHook

        作用: 解决 useState 在处理数据比较复杂的时候的使用问题

        [数据,处理数据的委托] = useReducer(处理函数,数据初始值)
*/

function useCount() {
  const [count, setCount] = useState(0);
  //   const add1 = () => {
  //     setCount(count + 1);
  //   };
  //   const add2 = () => {
  //     setCount(count - 1);
  //   };
  //   const add3 = () => {
  //     setCount(count + 5);
  //   };

  //   function add({ type, pyload }) {
  //     if (type == "add1") {
  //       setCount(count + 1);
  //     } else if (type === "add2") {
  //       setCount(count - 1);
  //     }
  //   }
  //   return [count, add];
}

const reducer = (state, action) => {
  console.log(action);
  //判断action的type进行处理
  switch (action.type) {
    case "add1":
      state++;
      break;
    case "add2":
      state--;
      break;
    case "add3":
      state += action.pyload;
      break;
  }
  return state;
};

export default function ReducerHook() {
  const [count, dispatch] = useReducer(reducer, 0);

  return (
    <div>
      <div>ReducerHook</div>
      <p>{count}</p>
      <button onClick={() => dispatch({ type: "add1", pyload: 10 })}>++</button>
      <button onClick={() => dispatch({ type: "add2" })}>++</button>
      <button onClick={() => dispatch({ type: "add3", pyload: 5 })}>++</button>
    </div>
  );
}

 

 5.useRef

import React, { useEffect, useRef } from "react";

export default function RefHook() {
  const btn = useRef();
  const sp = useRef();
  // console.log(btn);
  // 在componentDidMount后获取
  useEffect(() => {
    console.log(btn.current);
    console.log(sp.current);
  }, []);
  return (
    <div>
      <button ref={btn}>Button</button>
      <span ref={sp}>你好</span>
    </div>
  );
}

 

6.自定义Hook

import React, { useState } from "react";
/* 
    目标:
        自定义Hook
        把自己处理数据的过程变成一个hook

    要求:
        hook都要以use开头
        
    好处:
        1.代码简洁,方便书写和维护
        2.逻辑会更加独立    
*/

function useCount() {
  const [count, setCount] = useState(0);
  const onClick = () => {
     setCount(count + 1);
  };
  return [count, onClick];
}
export default function CusHook() {
  const [a, b] = useCount();
  return (
    <div>
      <h1>CusHook</h1>
      <p>{a}</p>
      <button onClick={b}>++</button>
    </div>
  );
}

 

posted @ 2022-04-09 23:34  李云蹊  阅读(60)  评论(0编辑  收藏  举报