美文网首页前端开发那些事儿
vue3.0用法对比react hook

vue3.0用法对比react hook

作者: 祝家庄打烊 | 来源:发表于2020-08-14 17:52 被阅读0次

    网上有很多大佬,都说vue3.0的很像react hook,在好奇心的驱使下,研究了几个demo进行对比,在我看来,原理是比较接近,都是采用了函数式组件编程,废弃了class组件编程的方式,但是语法用起来差异还是比较大的。

    生命周期

    Vue:废弃了beforeCreate和create,使用setup代替,定义的数据/方法/生命周期都是定义在setup当中,而不是一个并行的出现。

    export default {
      setup (props,context) {
        //生命周期
        onMounted(()=>{
          console.log(111111);
        })
        onBeforeUnmount(()=>{
          console.log(222222);
        })
      }
    }
    

    React:生命周期都是通过useEffect来实现的,当数据发生变化的时候,会触发当前的回调函数,相当于componentDidMount和componentDidUpdate两个生命周期。

    //componentDidMount触发
    useEffect(()=>{
        console.log("生命周期")
    },[]);
    //componentDidUnmount触发
    useEffect(()=>{
         return ()=>{
             console.log("生命周期")
         }
     },[]);
    //componentUpdate触发
    const mounted = useRef();
    useEffect(()=>{
        if(!mounted.current){
            //componentDidMount
            mounted.current=true
        }else{
            //componnentDidUpdate
        }
    });
    

    定义响应式数据

    Vue:相应数据不再通过Object.defineProperty进行数据劫持,是通过ES6的最新语法proxy,加快了响应速度,解决了不能截取数组下标数据和属性的疑难,还提供了isRef监听数据类型,toRefs转化数据类型。

    import { reactive ,ref ,isRef, toRefs } from '@vue/composition-api';
    export default {
      setup (props,context) {
        const res = reactive({'name':'zhuy'}); //定义响应式数据,针对对象
        const count = ref(0); //定义基本类型数据
        const obj = toRefs(res); //响应式数据还原成对象,主要解决响应式数据结构或其它操作出现的问题。
        return {
          res,
          count,
          doubleCount
        }
      }
    }
    

    React:通过useState定义数据,数组解构两个方法,获取和修改

    import React, { useState } from 'react';
    function Hook(){
        const [getCount,setCount] = useState(99);
        const [getName,setName] = useState("祝阳");
        return (
            <div>
                <p>姓名:{getName}   年纪:{getCount}</p>
                <button onClick={()=>setCount(getCount+1)}>click</button>
            </div>
        )
    }
    export default Hook;
    

    状态管理工具

    Vue:在vue中定义vuex/store的方式不变,引用的方式发生了改变,这里需要注意的是,所有需要渲染的数据/方法都需要返回出来。

    import { getCurrentInstance } from '@vue/composition-api';
    export default {
      setup (props,context) {
        const name = computed(() => ctx.$store.state.res.name);
        return {
          name
        }
      }
    }
    

    React:使用了useReducer方法,第一个参数是reducer纯函数,第二参数是初始状态。结构出state和action,用户发送action,触发reducer返回新状态;

    import React, { useReducer } from "react";
    import ReactDOM from "react-dom";
    import "./styles.css";
    
    const myReducer = (state, action) => {
      switch(action.type) {
        case('countUp'):
          return {
            ...state,
            count: state.count + 1
          }
        default:
          return state
      }
    }
    
    function App() {
      const [state, dispatch] = useReducer(myReducer, { count: 0 })
    
      return (
        <div className="App">
          <button onClick={() => dispatch({ type: 'countUp' })}>
            +1
          </button>
          <p>Count: {state.count}</p>
        </div>
      );
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App />, rootElement);
    

    相关文章

      网友评论

        本文标题:vue3.0用法对比react hook

        本文链接:https://www.haomeiwen.com/subject/wbxndktx.html