十、react-redux中共享数据状态

一、案例:定义一个Person组件,和Count组件通过redux共享数据
  1. 为Person组件编写reducer和action
    reducers/person.js
const initState = [{id:'001',name: 'Tom', age: 18}]
export default function personReducer(prestate=initState, action) {
    const {type, data} = action
    switch(type) {
        case 'addPerson':
            return [data, ...prestate]
        default:
            return prestate

    }
}

actions/person.js

export const addPerson = personobj => ({type: 'addPerson',data:personobj})

重点:Person的reducer和Count的Reducer要使用combineReducers进行合并, 合并后的总状态是一个对象!!!
store.js

import {createStore,applyMiddleware,combineReducers} from 'redux'
import countReducer from './reducers/count'
import personReducer from './reducers/person'
import thunk from 'redux-thunk'
//利用combineReducers函数将两个reducer进行合并
//注意:最后合成的store是一个对象
const allReducers = combineReducers({
    countReducer,
    personReducer
})

export default createStore(allReducers, applyMiddleware(thunk))

containers/person.js

import React, { Component } from 'react'
import {connect} from 'react-redux'
import {addPerson} from '../../redux/actions/person'
import {nanoid} from 'nanoid'

class Person extends Component {
    addPerson = () => {
        const name = this.nameNode.value
        const age = this.ageNode.value
        this.props.addPerson({id:nanoid(),name,age})
    }
    render() {
        return (
            <div>
                <input ref={c => this.nameNode=c} type="text" placeholder="请输入名字"/>
                <input ref={c => this.ageNode=c} type="text" id="" placeholder="请输入年龄"/>
                <button onClick={this.addPerson}>添加</button>
                <ul>
                    {
                        this.props.persons.map((obj) => {
                            return <li key={obj.id}>{obj.name}-{obj.age}</li>
                        })
                    }
                </ul>
            </div>
        )
    }
}
export default connect(
    state => ({persons:state.personReducer,}),
    {addPerson}
)(Person)
  • 在Count组件中若想要获取personReducer中的状态,则需要在Count的容器组件中映射状态
state => ({
        count: state.countReducer,
        personNum: state.personReducer
    })
然后即可通过this.props.personNum.length来获取到Person数组的长度
二、如何在react中生成一个唯一的标识id
  1. 当对数据进行遍历时,需要绑定一个key值,根据diffing算法,可知此时的此时的id最好是一个唯一值,那么如何方便快捷的生成一个唯一的id值呢?
  2. 步骤:
(1)npm install nanoid
(2)import {nanoid} from 'nanoid
(3)id:nanoid()
此时会自动生成一个唯一的id标识,如下图:

nanoid生成的唯一id标识

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值