zoukankan      html  css  js  c++  java
  • useReducer代替Redux小案例-1(七)

    使用useContextuseReducer是可以实现类似Redux的效果,并且一些简单的个人项目,完全可以用下面的方案代替Redux,这种做法要比Redux简单一些。因为useContextuseReducer在前两节课已经学习过了,所以我们这节课把精力就放在如何模拟出Redux的效果。如果你目前还不能掌握基本的语法,可以再复习一下前两节的知识点。

    理论上的可行性

    我们先从理论层面看看替代Redux的可能性,其实如果你对两个函数有所了解,只要我们巧妙的结合,这种替代方案是完全可行的。

    useContext:可访问全局状态,避免一层层的传递状态。这符合Redux其中的一项规则,就是状态全局化,并能统一管理。

    useReducer:通过action的传递,更新复杂逻辑的状态,主要是可以实现类似Redux中的Reducer部分,实现业务逻辑的可行性。

    经过我们在理论上的分析是完全可行的,接下来我们就用一个简单实例来看一下具体的实现方法。那这节课先实现useContext部分(也就是状态共享),下节再继续讲解useReducer部分(控制业务逻辑)。

    编写基本UI组件

    既然是一个实例,就需要有些界面的东西,小伙伴们不要觉的烦。在/src目录下新建一个文件夹Example6,有了文件夹后,在文件夹下面建立一个showArea.js文件。代码如下:

    import React from 'react';
    function ShowArea(){
       
        return (<div style={{color:'blue'}}>字体颜色为blue</div>)
    
    }
    export default ShowArea
    

    显示区域写完后,新建一个Buttons.js文件,用来编写按钮,这个是两个按钮,一个红色一个黄色。先不写其他任何业务逻辑。

    import React from 'react';
    
    function Buttons(){
        return (
            <div>
                <button>红色</button>
                <button>黄色</button>
            </div>
        )
    }
    
    export default Buttons
    

    然后再编写一个组合他们的Example6.js组件,引入两个新编写的组件ShowAreaButtons,并用<div>标签给包裹起来。

    import React, { useReducer } from 'react';
    import ShowArea from './ShowArea';
    import Buttons from './Buttons';
    
    
    function Example6(){
        return (
            <div>
                    <ShowArea />
                    <Buttons />
            </div>
        )
    }
    
    export default Example6
    

    这步做完,需要到/src目录下的index.js中引入一下Example6.js文件,引入后React才能正确渲染出刚写的UI组件。

    import React from 'react';
    import ReactDOM from 'react-dom';
    import Example from './Example6/Example6'
    
    ReactDOM.render(<Example />, document.getElementById('root'));
    

    做完这步可以简单的预览一下UI效果,虽然很丑,但是只要能满足学习需求就可以了。我们虽然都是前端,但是在学习时没必要追求漂亮的页面,关键时把知识点弄明白。我们写这么多文件,也就是要为接下来的知识点服务,其实这些组件都是陪衬罢了。

    编写颜色共享组件color.js

    有了UI组件后,就可以写一些业务逻辑了,这节课我们先实现状态共享,这个就是利用useContext。建立一个color.js文件,然后写入下面的代码。

    import React, { createContext } from 'react';
    
    export const ColorContext = createContext({})
    
    export const Color = props=>{
        return (
            <ColorContext.Provider value={{color:"blue"}}>
                {props.children}
            </ColorContext.Provider>
        )
    }
    

    代码中引入了createContext用来创建共享上下文ColorContext组件,然后我们要用{props.children}来显示对应的子组件。详细解释我在视频中讲解吧。

    有了这个组件后,我们就可以把Example6.js进行改写,让她可以共享状态。

    import React, { useReducer } from 'react';
    import ShowArea from './ShowArea';
    import Buttons from './Buttons';
    import { Color } from './color';   //引入Color组件
    
    function Example6(){
        return (
            <div>
                <Color>
                    <ShowArea />
                    <Buttons />
                </Color>
                
            </div>
        )
    }
    
    export default Example6
    

    然后再改写showArea.js文件,我们会引入useContext和在color.js中声明的ColorContext,让组件可以接收全局变量。

    import React , { useContext } from 'react';
    import { ColorContext } from './color';
    
    function ShowArea(){
        const {color} = useContext(ColorContext)
        return (<div style={{color:color}}>字体颜色为{color}</div>)
    
    }
    
    export default ShowArea
    

    这时候就通过useContext实现了状态的共享,可以到浏览器中看一下效果。然后我们下节课再实现复杂逻辑状态的变化。

    转自:https://jspang.com/posts/2019/08/12/react-hooks.html

  • 相关阅读:
    C#设计模式-单例模式
    MVC图片上传并显示缩略图
    asp.net MVC发布iis无法加载css,js和图片
    Silverlight中获取控件中子控件
    Lambda加自定义比较器实现两个列表的合并
    MVC文件上传
    pt-osc测试
    MySQL DDL方案测试及选型.
    gh-ost测试
    gh-ost原理
  • 原文地址:https://www.cnblogs.com/crazycode2/p/11767324.html
Copyright © 2011-2022 走看看