最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React Hook 很香吗

    正文概述 掘金(半路杀出个程咬金)   2020-11-30   436

    前言

    也许它真的很香 !!! 毕竟我也想 React 一把 , 虽然我现在的技术栈是 Vue 这是一篇回顾与学习的文章

    时隔两年,再一次回味 React ,这是一种久违且又怀念的味道,为什么这么说呢 ?

    2018年6,7月的时候,我曾经在一位IOS同事的带领下,使用了 React Native 为公司做了一款数据分析相关的App ,而后又相继使用了 React 写了一个后台应用,在此期间深受那位同事的开发模式启发,对模块化,组件化,组件高度复用 ... 等都有了新的理解与认识;与此同时,也深深的喜欢上了 React

    其实,我怀念的是 ...... 而后,我跳槽了,从 React 又回到了 Vue (原因也简单,新的公司统一技术栈Vue); 好了,回到主题 。

    Hook 是什么 ?

    Hook 是一个可以让你在函数组件里“钩入” React state 及生命周期等特性的函数 , 也就是说,曾经,我们只能在 class 类组件里边使用 state , 生命周期等特性,如今,就是可以在函数组件里使用这些特性的特质函数 。Hook 不能在 class 类组件里使用

    来认识一下 Hook

    Hook 实践

    在这里呢,我就不一点一点粘贴代码和叙述了,官方文档在关于 hook api 这一点上,写的还是很清楚的,我直接上一个关于 hook 大部分 api 的实践代码,大家看注释应该就可以理解了。

    /**
     * Hook 是一个可以让你在函数组件里“钩入” React state 及生命周期等特性的函数 
     * Hook 不能在 class 组件中使用 
     */
    import React, {
      useState,
      useEffect,
      useContext,
      useReducer,
      useCallback,
      useMemo,
      useRef
    } from "react"
    import { ContextObj } from "../home"
    import { prestyle, divstyle } from './style'
    
    // 惰性初始化 count 
    function GetA () {
      return 0;
    }
    
    // reducer 初始化 state 和定义逻辑的方法 
    const initState = { count: 0 }
    
    // reducer 方法
    function reducer (state, action) {
      switch (action.type) {
        case "add":
          return { count: state.count + 1 }
        case "jian":
          return { count: state.count - 1 }
        default:
          throw new Error()
      }
    }
    
    // useCallbackFn 回调函数 
    function useCallbackFn (count) {
      return count * 2;
    }
    
    // 修改count的外部函数 
    function setCountFun (count) {
      return count + 1;
    }
    
    // hook 组件 
    function Example (props) {
    
      // useState 
      // 定义初始化state和修改state的方法 
      // 惰性初始化 count ,通过一个函数获取初始的 state , 变量 count , GetA() 上边有定义
      const [count, setCount] = useState(() => {
        const a = GetA();
        return a;
      });
    
      // 直接默认初始化 count2 ↓
      const [count2, setCount2] = useState(0);
    
      // useEffect 
      // 相当于 class 类组件的生命周期  
      // componentDidMount     挂载完成 
      // componentDidUpdate    更新完成 
      // componentWillUnmount  销毁前   
      // 第二那个参数是依赖值,空数组则只执行一次 ,依赖值发生变化,则执行 useEffect hook
      useEffect(() => {
        console.log("hook - useEffect() 打印 count :", count, props);
        setCount2(count * 10)
      }, [count]) // [] :不触发
    
      // useContext 
      // 父...级创建了 Context 上下文  const ContextObj = React.createContext() 
      // ContextObj 必须是整个上下文 
      const value = useContext(ContextObj);
    
      // useReducer 
      // 类似初始化 state 和对应的修改方法
      // reducer , 接收两个参数,旧状态 state 和 新状态 action
      // initState , 初始化state值,这里是惰性的初始化  
      // 通过 dispatch 派发一个action 触发 reducer 对应的方法
      const [state, dispatch] = useReducer(reducer, initState);
    
      // useCallback => useMemo 的语法糖
      // useCallbackFn ,执行的逻辑
      // array , 依赖, 传依赖对应的值,值发生变化才执行 
      const memoCallback = useCallback(useCallbackFn, []);
    
      // useMemo 用法跟 useCallback 差不多 
      // fn ,创建逻辑函数 , 这里直接写内联 
      // array , 依赖  
      const memoValue = useMemo(() => { return count * 3 }, [count]);
    
      // useRef 返回一个可变的 ref 对象    
      // 父组件通过ref调用子组件属性和方法:子组件使用 useImperativeHandle(ref,fun) 
      // ref 则是传过来的ref , fun则是定义的被调用方法和属性
      // 然后导出组件用  export default forwardRef(子组件) 
      // 具体样例看 menu.jsx , 最后有案例完整代码
      const inpRef = useRef(null);
    
      return (
        <div style={divstyle}>
          <div>
            <p> 接收的 props random 值 {props.random} </p>
            <h3> useState 计数器 count : {count}  </h3>
            <h3> useEffect 监听 count x 10 = {count2} </h3>
            <button onClick={() => setCount(setCountFun(count))}> click + </button>
            &nbsp;
          <button onClick={() => setCount(count - 1)}> click - </button>
    
            <hr />
            <h3>useContext 上下文 : {value} </h3>
            <h3>useCallback 依赖计算 count * 2  =  {memoCallback(count)}</h3>
            <h3>useMemo 依赖计算 count * 3 = {memoValue}</h3>
            <h3>
              useRef 获取一个可变的对象 - 输入框  &nbsp;
            <input type="text" ref={inpRef} />  &nbsp;
            <button onClick={() => { inpRef.current.focus() }}>获取焦点</button>
            </h3>
            <h3>useLayoutEffect 类似 useEffect , 区别 : useLayoutEffect 是同步渲染 堵塞 ,useEffect 非堵塞</h3>
            <h3>useDebugValue 我没有实践,有兴趣的同学可以试一下 </h3>
            
            <hr />
            <h3>useReducer Count:{state.count} </h3>
            <button onClick={() => { dispatch({ type: "add" }) }}>useReducer +</button>
            &nbsp;
            <button onClick={() => { dispatch({ type: "jian" }) }}>useReducer -</button>
    
          </div>
          
        </div>
      );
    }
    
    export default Example;    
    
    

    总结

    通过上边的一个案例,也不知道各位同学有没有理解到,不过也不重要,为啥呢 ?因为一个程序猿只有码代码才能高效的学习到本质,所以我专门基于 Hook 写了一个社区应用,当然不仅仅是只有 Hook 还有 React 的常用知识点,包括Redux,分别都做了回顾 . 欣赏一下

    Hook 实践社区【学习,学习,学习,跟上节奏】

    登录页 - 两个入口 React Hook 很香吗 社区首页 含有【 注册-登录-右侧梯形导航 】 React Hook 很香吗

    右侧梯形导航React Hook 很香吗 登录-注册 React Hook 很香吗 文章详情 React Hook 很香吗

    温故而知新【回顾片段】

    Redux 标签片段 React Hook 很香吗 Hooks 标签片段 React Hook 很香吗 剩下的我就不一一去展示了,源码里边都有

    本着我自己回顾React,学习Hook 以及分享给大家的想法,我写了这个小小的应用,大家尽管吐槽和调侃,主要包含一下内容: 分为两类

    1,回顾 React 常用知识点 生命周期 ,Context , Refs ,Fragment , Hoc ,Portals ,Hooks ,Redux 均含有备注和源码导读

    2,Hook 实践编写了一个社区应用 基本上使用了 内置 Hook 的常用知识点 均含有备注和源码导读

    Go 完整代码 ~ biu ~ biu ~ biu 查看

    如果遇到如下问题:

    React Hook 很香吗 对应处理即可 , 我还没有看出来是什么问题 ~~~~ React Hook 很香吗


    起源地下载网 » React Hook 很香吗

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元