react-redux与redux个人笔记指南

148 阅读5分钟

最近在学习react,本来有点vue基础,信心满满埋头就学
哎,晕头转向,最开始基础基本全是this什么什么,然后又是bind什么什么
对那些es6玩的6的大佬来说简简单单啦,偏偏我就不是那一类
要是没点提示性的代码,让我学十天我也就会rcc+tab快捷一个小js
最近正好学到react-redux与redux扩充了一下自己的视野,特在这里记录一下
项目不会写的时候还可以过来看看,哈哈
第一步: 可能代码会记错,不要相信我 尤其是英文,我只是在做我自己能理解的笔记,算的上详细
   npm install --save redux  npm install --save react-redux
这两个安装下来
第二步:
1.在最主要的App.js文件里引入Provider,Provider会把store提供给它所包裹着的内部的所有组件,也就是说它下面所有的组件都可以访问store仓库

import React, { Component } from 'react';
import {Provider} from 'react-redux';           //一、 Provider把store提供给内部的所有组件
import  Header  from "./common/header/index";
import store from './store/index'

export default class App extends Component {
 render() {
   return (
     <Provider store={store}>                  //这里store就是下面要创建的store.js文件导出的
       <Header></Header>                       //包裹着最大的Header组件
     </Provider>
   )
 }
}

2.在src目录下创建store文件夹里面暂时添加index.js与reducer.js文件
3.对store下index.js文件进行配置

import {createStore} from 'redux'          //引入大佬级别核心API
import reducer from "./reducer"             //这个reducer就是下面配置的那个reducer.js导出的
                                                               
const store = createStore(reducer);         //然后把它传进这个核心API里面在赋值给store
export default store                        //组装成超级的store就导可以出去浪了
                                           //然后被最大的那个组件,也就是最上面第一段代码那里引入了

就像是个周转箱一样它就动动脑,根本不用它做事
4.reducer.js配置,就是上面第三部store引入的那个文件

const defaultState={                //这是个纯js代码文件看视频解说是传个参数,它返回个值就行了
      focused: false                  //这里是定义store中默认值的,可以一上来就能访问
};
                                      //可以看这里state=defaultState(默认值) , action就是从外部(别的组件)传来的数据、下面会介绍怎么传
export default (state=defaultState,action)=>{
                                      //在这里面做判断,返回对store里面数据怎么修改的指令
  return state;
}                                   //具体下面看实战,这只是配置

5.配置完了,已经把store共享出去了,可是每个组件该怎么拿到这些参数呢
6.在需要用到store的地方引入这个组件import { connect } from 'react-redux'; 它下面有
一系列方法可以快速获取store里的数据 套路模板,需要用直接复制粘贴

import React, { Component } from 'react'
// 与Provider组件做连接connect
import { connect } from 'react-redux';
export default class Header extends Component {
  render() {
      return (
          <div>
              
          </div>
      )
  }
}   //这里是export括号结束   在外面const   之前在括号里面const报错掰辞了好久才发现

const mapStateToProps = (state) => {
  return {
  	
  }
}
const mapDispathToProps = (dispatch) => {

  return {

  }       //还有记得看看return时{}大括号对不对,有没有少一半
}

export default connect(mapStateToProps, mapDispathToProps)(Header);     //这里Header就是导出的组件,也是第一步Provider所包裹的那个组件

第二步:
代码全部都关联上
1.最开始,在最大的总的组件上用Provider组件包裹,
2.并在Provider中传入store,
3.没有store所以需要我们创建store.js,reducer.js,
4.配置store.js文件,因为它需要引用reducer.js文件,所以在配置reducer.js文件,
5.哪个组件需要使用就引入connect这个方法,它有两个形参,并且它需要把使用store的这个组件作为值传进去

最后只差内容了,一个小demo怎么修改内容,怎么获取内容了,希望我能记得react-redux的样子

//APP.js
import React, { Component } from 'react';
//一、 Provider把store提供给内部的所有组件
import {Provider} from 'react-redux';
import Demo from './common/foter/Demo' //组件记得引入
import store from './store/index'

export default class App extends Component {
render() {
  return (
    <Provider store={store}>
      <Demo></Demo>
    </Provider>
  )
}
}


比如现在有Demo组件需要用到store中的值todo,并对它进行数据的更改

//demo组件
import React, { Component } from 'react'
// 与Provider组件做连接connect
import { connect } from 'react-redux';

class Demo extends Component {
 constructor(props){
     super(props);
 }
 render() {
     return (
         <div>
             <input
                 type="text"
                 value={this.props.todo}                 //input的value等于公共组件映射出来的todo
                 onFocus={this.props.handleFocus}        //获取焦点执行这个方法
                 onBlur={this.props.handleBlur}          //失去焦点执行这个方法
             />
             
             
         </div>
     )
 }
}

const mapStateToProps = (state) => {
 return {                                               // 形参state里面包含了store里的数据
     todo: state.todo,                          //把store里的todo赋值给todo,使得组件用this.props.todo可以访问数据
 }                                                   //结合上下文来看,放在这两个形参里的方法与值
}                                                       //在组件里都可以用this.props来获取与使用
const mapDispathToProps = (dispatch) => {                   
 return {
     handleFocus() {                                  //这个方法,在组件中就可以用this.props.handleFocus来使用
         const action = {                            //在这里面可以使用dispatch这个方法,它 可以把新的action(值)
             type: "todo_item",                      //返回给store,store拿着这些参数去reducer做对比做判断
         };
         dispatch(action);
     },
     handleBlur() {
         const action = {
             type: "todo_list"                       //type像是一道令牌,前面怎么定义,传到后面对比,只要type值(令牌)符合就会执行对应的更改或者操作
         };
         dispatch(action);                           //dispatch(action)把新的值发送给大仓库
     }
 }
}

export default connect(mapStateToProps, mapDispathToProps)(Demo);   //前面形参方法都是固定写法(Demo)则代表这个组件   

//store下的index.js文件   
import {createStore} from 'redux'
import reducer from "./reducer"

const store = createStore(reducer);
export default store;
//没什么好记得,都一样的  

这里做交互,做判断,前方返回的type令牌就在这里做判断,如果相等,就执行制定的数据

并返回给start做数据修改两种return的写法都一样,只不过第二种类似之前还没有学redux时修改数据那样,方便记忆


const defaultState={
        focused: false,
        todo:"公共数据"
};

export default (state=defaultState,action)=>{
    if(action.type==="search_focus"){   //如果action的type全等于"searCh_focus"(前面页面传过来的判断令牌)
        return {
            focused:true    //就将这个值返回给stort,里面封装的什么什么就会更新focused的值为true【这个新值】
        }                   //以下都一样
    }
    if(action.type==="search_blur"){
        const newState={
            focused:false
        }
        return newState;
    }
    if(action.type==="todo_list"){
        const newState={
            todo:'todo_list已更改'
        }
        return newState
    }
    if(action.type==="todo_item"){
        return {
            todo:"todo_item已更改"
        }
    }
    return state;
}

虽然很肤浅,很多都不会说,只知道有那效果,但总比不知道那效果又有进步一点吧,写到这里,我已经把start与store弄混淆了