Redux工程化应用:多组件容器共享(拆分reducer)

Redux工程化应用:在react中使用redux

​ 一、准备工作:

​ 1、创建redux01工程目录;

​ 2、创建清单文件 npm init -y

​ 3、安装第三方依赖包 npm install react react-dom react-scrtipts redux --save

​ 4、创建public文件夹 — index.html

​ 5、创建src文件夹,在该文件夹下创建

​ (1)redux文件夹,用于存放redux相关文件(person_action.js、person_reducer.js、test_action、test_reducer、store.js);

​ (2)创建App.css,用于编写APp页面样式;

​ (3)创建App.js,作为外层组件;

​ (4)创建index.js入口文件;

​ (5)创建components文件夹,用于存放子组件(Person.jsx、Test.jsx)

​ 6、src目录:
请添加图片描述

​ 二、编写代码:

​ 1、index.html:

    <div id="root"></div>

​ 2、index.js:

import ReactDOM from 'react-dom/client'
import App from './App'
import store from './redux/store'
const root = ReactDOM.createRoot(document.getElementById('root'))

root.render(
    <App/>
)
// 订阅时 重新渲染页面(目的是为了改变数据)
store.subscribe(() => {
    root.render(
        <App/>
    ) 
})


​ 3、App.js:

import React, { Component } from 'react'
import Person from './components/Person'
import Test from './components/Test'
import './App.css'

export default class App extends Component {
  render() {
    return (
      <div className='app'>
        <Person/>
        <hr/>
        <Test/>
      </div>
    )
  }
}

​ 4、App.css:

.app {
    
     
    margin: 0 auto;
    padding: 10px 15px;
    width: 400px;
    height: 400px;
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
}

​ 5、Person.jsx:

import React, { Component } from 'react'
import store from "../redux/store.js"
import { updateName, updateArms } from "../redux/person_action";

export default class Person extends Component {
  // 姓名的处理函数 把值传给action
  upName = (e) => {
    let name = e.target.value
    // console.log(name);
    store.dispatch(updateName(name))
  }

  // 兵器的处理函数
  upArms = (e) => {
    let arms = e.target.value
    // console.log(arms);
    store.dispatch(updateArms(arms))
  }
  render() {
    // console.log(store.getState());
    let { personReducer, testReducer } = store.getState()
    return (
      <div>
        <h3>Person组件</h3>
        姓名:
        <select onChange={e => this.upName(e)}>
          <option value="张飞">张飞</option>
          <option value="关羽">关羽</option>
          <option value="刘备">刘备</option>
          <option value="曹操">曹操</option>
          <option value="周瑜">周瑜</option>
        </select>
        <br />
        兵器:
        <select onChange={e => this.upArms(e)}>
          <option value="丈八蛇矛">丈八蛇矛</option>
          <option value="青龙偃月刀">青龙偃月刀</option>
          <option value="双股剑">双股剑</option>
          <option value="长弓">长弓</option>
          <option value="双截棍">双截棍</option>
        </select>
        <p>{personReducer.name} - {personReducer.arms}</p>
        <p>出自:{testReducer}</p>
      </div>
    )
  }
}

​ 6、Test.jsx:

import React, { Component } from 'react'
import store from '../redux/store'
import { setBook } from '../redux/test_action'


export default class Test extends Component {

  setName = e => {
    console.log(e.target.value);
    store.dispatch(setBook(e.target.value))
  }

  render() {
    let { personReducer, testReducer } = store.getState()
    return (
      <div>
        名著:
        <select onChange={this.setName}>
          <option value="三国演义">三国演义</option>
          <option value="水浒传">水浒传</option>
          <option value="红楼梦">红楼梦</option>
          <option value="西游记">西游记</option>
        </select>
        <br />
        <p>{testReducer}</p>
        <p>{personReducer.name} - {personReducer.arms}</p>
      </div>
    )
  }
}


​ 7、person_action.js:

import { UPNAME, UPARMS } from "./constants"

// 生产action
const updateName = (data) => {
    return {
        type:UPNAME,
        data
    }
}

const updateArms = (data) => {
    return {
        type:UPARMS,
        data
    }
}

export{
    updateArms,
    updateName
}

​ 8、person_reducer.js:

import { UPNAME, UPARMS } from './constants'  //导入常量

export default (state={name:'张飞',arms:'丈八蛇矛'},action) => {
    let {type,data} =action
    switch (type){ 
        case UPNAME:
            return {
                ...state,
                name: data
            }
        case UPARMS:
            return{
                ...state,
                arms: data
            }
        default:
            return state
    }
}

​ 9、test_action.js:

import {BOOK} from './constants'  //导入常量

const setBook = data => {
    return {
        type: BOOK,
        data
    }
}

export {
    setBook
}

​ 10、test_reducer.js:

import { BOOK } from "./constants"

export default  (state='三国演义',action) => {
    let {type,data} = action
    switch (type) {
        case BOOK:
            return data
        default:
            return state
    }
}


​ 11、constans.js:

// 该文件用于存放常量  方便以后管理
const UPNAME = 'UPNAME'
const UPARMS = 'UPARMS'
const BOOK = 'BOOK'

export {
    UPNAME,
    UPARMS,
    BOOK
}

​ 12、store.js:

import { createStore, combineReducers} from "redux";
import personReducer from './person_reducer'
import testReducer from "./test_reducer";

const rootReducer = combineReducers({personReducer,testReducer})

export default createStore(rootReducer)

​ 13、运行结果:

​ 当点击Person组件中的列表时,Person和Test组件中相应的数据都会随之改变;

​ 同理,点击Test组件中的列表时,Person和Test组件中相应的数据也会随之改变;
请添加图片描述

猜你喜欢

转载自blog.csdn.net/qq_53008791/article/details/126409219
今日推荐