我们还可以使用自定义 Hook 进行数据通信

点击这里预览:https://mcx2020.github.io/ownhook-react/index.html
点击这里查看源码:https://github.com/mcx2020/ownhook-react

一、创建 useStore Hook

这里作为我们的数据中心管家

  1. // useStore.js
  2. import {useState,createContext} from "react";
  3. const store = {
  4. allTime:100
  5. }
  6. function useStore(){
  7. let [restTime, setRestTime] = useState(store.allTime)
  8. const minusTime = (time)=>{
  9. if(restTime<=0){
  10. alert('时间用完了')
  11. return
  12. }else if(time>restTime){
  13. alert('时间不够了')
  14. return
  15. }
  16. setRestTime(restTime-time)
  17. }
  18. return {restTime,minusTime}
  19. }
  20. const StoreContext = createContext(null)
  21. export {useStore,StoreContext}

二、引入 useStore Hook

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './index.css';
  4. import {useStore,StoreContext} from "./stores/useStore";
  5. import Text from './components/text'
  6. import Father1 from "./components/father1";
  7. import Father2 from "./components/father2";
  8. function App() {
  9. return (
  10. <div className='app'>
  11. <Text />
  12. <StoreContext.Provider value={useStore()}>
  13. <div className='test-wrapper'>
  14. <Father1 />
  15. <Father2 />
  16. </div>
  17. </StoreContext.Provider>
  18. </div>
  19. )
  20. }

三、总结一下

在这里,我们通过 useStore 这个函数在内部维护了 store,然后 return 出修改 store 的 API

  • 这些 API 通过 Context 的方式传递出去
  • 组件通过 Context 拿到 这些 API 并使用它们
  • 当 store 的数据修改时,Context 的 value 相继变化,于是主动触发渲染更新 UI

「@浪里淘沙的小法师」