react

168 阅读4分钟

vue和react区别

共同点

数据驱动视图
组件化
都用了虚拟dom

不同点

核心思想
Vue的核心思想是尽可能的降低前端开发的门槛,是一个灵活易用的渐进式双向绑定的MVVM框架。
React的核心思想是声明式渲染和组件化、单向数据流,React既不属于MVC也不属于MVVM架构

虚拟dom

都是用JS对象来模拟真实DOM,然后用虚拟DOM的diff来最小化更新真实DOM。
vue 组件响应式思想 采用代理监听数据,我在某个组件里修改数据,就会明确知道那个组件产生了变化,只用 
diff 这个组件就可以了
react采用自顶向下的全量diff,vue是局部订阅的模式
react 函数式组件思想 当你 setstate 就会遍历 diff 当前组件所有的子节点子组件
react中数据发生变化(调用setstate时),render函数就会执行,重新生成一个新的虚拟dom,这个虚拟dom
和旧的虚拟dom做比较,得出差异然后渲染

react生命周期

组件的挂载:
   constructor   组件初始化数据
   componentWillMount   代表组件已经初始化数据了 但还没有渲染DOM
   render(渲染组件)  组件开始渲染和(更新)触发
   componentDidMount dom节点已经生成 发送异步请求获取数据
   
更新
   componentWillReceiveProps :当父组件更新子组件state时,该方法会被调用。
   shouldComponentUpdate : 该方法决定组件state或props的改变是否需要重新渲染组件。
   componentWillUpdate  更新之前
   render再次渲染视图  会得到一份虚拟dom,并且和上一次的虚拟dom进行对比
   (dom diff的到最小的差异),只重新渲染有差异的部分
   componentDidUpdate 更新之后
组件的卸载
   componentWillUnmount 卸载之前清除定时器

移除的生命周期

componentWillMount--- componentWillUpdate---- componentWillReceiveProps-----

新生命周期

实例期:
constructor
getDerivedStateFromProps
render
componentDidMount

运行期:
props 更新:
getDerivedStateFromProps
shouldComponentUpdate
render
getSnapshotBeforeUpdate
componentDidUpdate

state 更新:
getDerivedStateFromProps
shouldComponentUpdate
render
getSnapshotBeforeUpdate
componentDidUpdate

useEffect

 模拟 class 组件的 componentDidMount 和 componentDidUpdate
 第一个参数执行函数,第二个参数不传
useEffect(() => {
  console.log('DidMount 和 DidUpdate')
})
 
 模拟 class 组件的 componentDidMount
 第一个参数执行函数,第二个参数传空数组[]
 useEffect(() => {
    console.log('加载完了componentDidMount')
 }, [])  第二个参数是 [] (不依赖于任何 state)
 
  模拟 class 组件的 componentDidUpdate
  第一个参数执行函数,第二个参数传state数组
 useEffect(() => {
     console.log('更新了')
 }, [count, name])  第二个参数就是依赖的 state
 
模拟 class 组件的 componentDidMount 和 componentWillUnmount
useEffect(() => {
    let timerId = window.setInterval(() => {
        console.log(Date.now())
    }, 1000)
     返回一个函数
     模拟 componentWillUnmount 组件销毁的时候 停止计时器
    return () => {
        window.clearInterval(timerId)
    }
}, [])

useEffect和useLayoutEffect的区别

useEffect是异步执行的,而`useLayoutEffect`是同步执行的。
useEffect的执行时机是浏览器完成渲染之后,
而 `useLayoutEffect` 的执行时机是浏览器把内容真正渲染到界面之前,
和 `componentDidMount` 等价。

useMEmo和useCallback

在依赖数据发生变化的时候,才会调用传进去的回调函数去重新计算结果,起到一个缓存的作用
useMemo  缓存的结果是回调函数中return回来的值,主要用于缓存计算结果的值,
应用场景如需要计算的状态
useCallback  缓存的结果是函数,主要用于缓存函数,
应用场景如需要缓存的函数,因为函数式组件每次任何一个state发生变化,
会触发整个组件更新,一些函数是没有必要更新的,此时就应该缓存起来,
提高性能,减少对资源的浪费

redux执行流程

1.store通过reducer创建初始状态 
2.view通过store.getState()获取公共状态
3.view改变状态,需要调用action里面的方法,
action里面被调用的方法会通过 store.dispatch()方法传递行为标识给reducer
4.reducer接收到action并根据传递过来来的行为标识来改变状态
5.store中改变的状态会被view重新获取

redux组成部分

StateRedux中的数据
Reducer:这是Redux的核心,内部处理接受到action后到返回新的state的逻辑;
reducer可以进行嵌套,一个store只有一个根reducer
Action:一般会写成actionCreator函数的形式,这个函数返回的就是action对象,
这个对象至少会一个type属性,用于标识当前的动作
Store: 以上三部分组成的就是一个Store,一般来说一个应用仅存在一个Store,
它可以进行读取应用的state,监听state的变化,发起一个action等操作

store:用来存储数据的
reducer:管理数据的(事件处理函数)
actionCreators:创建action,是action的创建者,交由reducer来处理
view:用来使用数据,在这里,一般用reducer组件来充当