• React之redux(1)——redux组成


    1 State——状态:

    2 Action——事件

      Action是把数据从组件传递到Store的载体,它是store数据的唯一来源,一般来说,我们可以通过store.despach()将action传递给store

     action的特点:

     

    创建action,通过创建一个函数,然后再返回一个对象,注意需要携带type属性:

    action/index.js

    const sendAction = () => {
      return {
        type: "SEND_ACTION",
        value: "我是一个action"
      }
    }
    
    module.exports = { sendAction }

     3 Reducer

      本质就是一个函数,它用来响应发送过来的actions,然后经过处理,把state发送给Store

      在Reducer函数中,必须要有return返回值,这样Store才能接收到数据

      函数会接收到两个参数,第一个参数是初始化state,第二个参数是action:

    三者之间的关系:

    reducer/index.js

    // 创建reducer函数,专门用来处理发送过来的action
    // 初始化state,如果没有传过来state,就用这个
    const initState = {
      value: "默认值"
    }
    
    const reducer = (state = initState, action) => {switch (action.type) {
        case "SEND_ACTION":
          return Object.assign({}, state, action);
        default:
          return state;
      }
    }
    
    module.exports = { reducer }

    4 Store:

      就是把action和reducer联系到一起的对象

     主要职责:

    • 维持应用的state
    • 提供getState()方法获取state
    • 提供dispatch()方法发送action
    • 通过subscribe()来注册监听
    • 通过subscribe()的返回值来注销监听

    store/index.js

    import { createStore } from 'redux'
    
    // 导入我们创建好的reducer
    
    import { reducer } from '../reducer'
    
    // 构建store,把reducer注入到store中
    const store = createStore(reducer)
    
    export default store;

    接下来,在哪个页面如果要监听数据的话,就可以用store.subscribe()注册监听,当用store.dispatch()发送一个action的时候,就能触发我们的监听了,在里面利用store.getState()就能拿到值

    import React, { Component } from 'react'
    // 导入store
    import store from '../../store/index'
    // 导入action构建函数
    import { sendAction } from '../../action/index';
    
    export default class index extends Component {
      constructor(props) {
        super(props)
      }
    
      handleClick = () => {
        // 拿到action对象
        const action = sendAction();
        // 发送一个action,用来②触发监听
        store.dispatch(action);
        // 给state传空对象来刷新页面
      }
    
      // 当组件一加载完毕的时候,来①注册监听
      componentDidMount() {
        store.subscribe(() => {
          console.log(store.getState());
          this.setState({});
        })
      }
    
      render() {
        return (
          // 如果不想页面多一个层级的话,可以用一对空组件来占位
          <>
            <button onClick={this.handleClick}>点击发送一个action</button>
            {/* 通过store.getState()③拿到值 */}
            <div>{store.getState().value}</div>
          </>
        )
      }
    }

    大致流程图如下:

  • 相关阅读:
    console.time测试代码块执行时间
    label表单的关联性
    attr返回被选元素的属性值
    2018 885程序设计编程题
    输出斐波拉数列的前n个数(n>=2)
    简单的光照贴图
    复杂纹理复制及纹理叠加效果
    简单纹理复制
    UV旋转shader
    shader实现积雪效果
  • 原文地址:https://www.cnblogs.com/codexlx/p/12797847.html
Copyright © 2020-2023  润新知