React Hooks

2020-04-01  本文已影响0人  zhenghongmo

1、useState(使用状态)

const [user,setUser] = useState({name:'xxx', age: 20})
setUser({
      name: 'yyyyy'
 }) //这样user中的age就不会保存,只留下name
const [state, setState] = useState(()=>{
    return initialState
})
//该函数返回初始state,且只执行一次
const [n, setN] = useState(0)
---------------------
onClick = () => {
    setN(n+1)
    setN(n+1)
}
 n 并不能加 2
--------------------
onClick = () => {
    setN(i=>i+1)
    setN(i=>i+1)
}
但是这样n就可以加2

2、useReducer

const initial = {
  n: 0
};
const reducer = (state, action) => {
  if (action.type === "add") {
    return { n: state.n + action.number };
  } else if (action.type === "multi") {
    return { n: state.n * action.number  };
  } else {
    throw new Error("unknown type");
  }
};

function App() {
  const [state, dispatch] = useReducer(reducer, initial);
  const { n } = state;
  const onClick = () => {
    dispatch({ type: "add", number: 1 });
  };
  return (
    <div className="App">
      <button onClick={onClick}>+1</button>
    </div>
  );
}

3、useContext(上下文)

const mycontext = createContext(null);

function App() {
  const [n, setN] = useState(0);
  return (
    <mycontext .Provider value={{ n, setN }}>   //value把值传过来,在此作用域中的都可以用此值
      <div className="App">
        <Child/>
      </div>
    </mycontext .Provider>
  );
}
function Child() {
  const { n, setN } = useContext(mycontext);  //取到父组件中的useState
  return (
    <div>
      n: {n} 
    </div>
  );
}

4、useEffect(副作用)

5、useLayoutEffect(布局副作用)

6、 useMemo => useCallback

function App() {
  const [n, setN] = React.useState(0);
  const [m, setM] = React.useState(0);
  const onClick = () => {
    setN(n + 1);
  };
  const onClickChild = useMemo(() => {
    const fn = div => {
      console.log(div);
    };
    return fn;
  }, [m]);
  return (
    <div className="App">
      <div>
        <button onClick={onClick}>update n {n}</button>  //点击后n变化了,但是m没有变
      </div>
      <Child data={m}  onClick={onClickChild}/ >    //就算m没有变化,Child组件也会执行,但如果用React.memo(Child)后,m不变就不会再执行一次Child组件,如果添加一个监听函数(例如onClick)就算m不变还是一样会执行,这时候就要用useMemo
    </div>
  );
}
function Child(props) {
  console.log("child 执行了");
  console.log('假设这里有大量代码')
  return <div onClick={e => props.onClick(e.target)}>child: {props.data}</div>;
}
const Child2 = React.memo(Child);

7、useRef

8、自定义hooks

import { useState, useEffect } from "react";
const useList = () => {
  const [list, setList] = useState(null);
  useEffect(() => {
    ajax("/list").then(list => {
      setList(list);
    });
  }, []); // [] 确保只在第一次运行
  return {
    list: list,
    setList: setList
  };
};
export default useList;
function ajax() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve([
        { id: 1, name: "Frank" },
        { id: 2, name: "Jack" },
        { id: 3, name: "Alice" },
        { id: 4, name: "Bob" }
      ]);
    }, 2000);
  });
}
-------------------------------------------
在别的组件中可以使用这个hooks
import useList from "./hooks/useList";
const { list, setList } = useList();
上一篇 下一篇

猜你喜欢

热点阅读