zoukankan      html  css  js  c++  java
  • redux 状态管理工具

    安装
    	npm i redux --save
    三大原则
    	1、单一数据源
    	2、State是只读的,保证数据可以追溯(需要拿到之前的数据,在进行更改)
    	3、使用纯函数来执行修改
    

    状态管理工具

    三大原则:
    		某个组件的状态,需要共享
    				某个状态需要在任何地方都可以拿到
    				一个组件需要改变全局状态
    				一个组件需要改变另一个组件的状态
    

    查看redux的官网,阮一峰的redux

    仓库的使用

    app.js引入仓库
    创建store和component两个文件夹
    创建一个仓库:存数据,改数据,取数据
    ///存数据 
    1、引入 import {createStore}  from  “redux”
    2、设置初始数据
    initState= {key:value}
    	var intial = {
    			n:5
    		}
    将函数传给reducer(两个参数state和action)
    var reducer = (state(接受数据)=intial(初始状态),action(动作,如何修改动作))=>{
        console.log(run reducer)//署名这个函数运行了
    	return state;
    }//reducer这是一个纯函数(只要是同样的输入,必定得到同样的输出
    )
    //创建仓库
    var store = createStore(reducer)//仓库是唯一的,调用reducer函数,将初始值存储到仓库中去
    console.log(store)
    //导出
    export default store
    ////取数据:
    	console.log(store.getState().state中的变量)获取状态
    

    高阶组件(参数是组件,返回值也是组件,Hoc)

    1、属性代理
    2、反向继承 又名(渲染劫持)
    
    store.dispatch(动作)
    action是一定要含有type的一个对象
     动作发给了reducer第二个参数 action
    action一定有type,还可能接收一些其他的参数
    根据type修改数据
    
            a.做state的复本
        ​	b.修改state的副本对象
        ​	c.返回新的复本对象
    
    1.切到two,就会走hoc,仓库抛发动作,传给redduccer的action,判断type是不是rec,所以反悔了新的state,
    2.此时仓库里面已经是新的path值了,仓库里面存的是登录成功后要跳转的路由的路径,判断有没有这个值,如果有就跳转,
    3.store.getState dispatch({type:'xxx',key:value})
    4.action对象的type值,千万不能重复
    5.store.dispatch(动作)
    6.action是一定要含有type的一个对象
    7.动作发给了reducer第二个参数 action
    8.action一定有type,还可能接收一些其他的参数
    9.根据type修改数据
        ​	a.做state的复本
        ​	b.修改state的副本对象
        ​	c.返回新的复本对象
    
    getState()  获取状态 
    dispatch ({type,payload})   分发状态
    subscribe  监听store里的数据变化
    
    

    context

    Provider生产者  consumer  消费者
    创建一个组件MyProvider
    引入createContext
    将let {Provider,Consumer} =createContext() 解构
    <Provider value={666}>{this.props.children}</Provider>  属性一定要叫value,this.props.children一定要写,这个是app组件
    export {Myprovider,Consumer}
    
    入口文件引入这个组件并将app包裹
    
    在需要的组件内引入Consumer
    import {Consumer} from "MyProvider(组件)"
    <Consumer>
        
    {
       (value)=>{
        		return <div>{value}</div>
    	}
    }
    
     </Consumer>
    	
    

    在其他钩子里面拿到值
    let context = createContext()
    let {Provider,Consumer} = context
    
    1、引入context
    2、在使用context传来的数据的组件里面写一个静态属性,对静态属性的赋值
    	static contextType = context
    componentDidMount(){
    		设置后就可以拿到this.context传过来的数据
    		console.log(this.context)
    	}
    

    分模块

    	combineReducer({
    		模块的名字:引入的模块
    })
    
    分模块以后
    		store.getState() 模块的名字.变量
    
    数据里面套对象,则深拷贝  JSON.parse(JSON.stringfy())  深拷贝	
    applyMiddleware  
    请求数据后接一个回调,再用dispatch发送给redux,redux接收数据
    在store里面的actioncreate里请求数据,
    
    

    在config。ovvver那个文件里面将@指向src

    const {addWebpackAlias)   = require(‘customize-cra’)
    const {resolve} = require(‘path’)
    addWebpackAllias({
    “@”:resolve(’src’)}) 
    

    配置装饰器(mobx)

    @babel/plugin-proposal-decorators

    const {addDecoratorsLegacy} = require(‘customize-cra’)

    module default

  • 相关阅读:
    POJ 1984
    剑指offer 7. 斐波那契数列 & leetcode 剑指 Offer 10- I. 斐波那契数列
    剑指offer 60. 把二叉树打印成多行
    数据库的范式(建表的原则)
    剑指offer 59. 按之字形顺序打印二叉树
    力扣142.环形链表II & 剑指offer 55. 链表中环的入口结点
    GET 和 POST 的区别
    理解Cookie和Session的区别及使用
    基本排序算法代码实现,以及使用场景推荐
    The Castle OpenJ_Bailian
  • 原文地址:https://www.cnblogs.com/cc0419/p/12546617.html
Copyright © 2011-2022 走看看