【问题标题】:How to display the updated state in the redux store如何在 redux store 中显示更新后的状态
【发布时间】:2019-09-01 10:06:45
【问题描述】:

我是 redux 的新手。我有一个表格,我需要打印表格中输入的数据。我正在通过本地状态更新 redux 状态,但无法通过 mapStateToProps 方法显示状态变量。

提前致谢

//App.js文件中的表单组件

import React,{Component} from 'react';
import {action1} from './Actions/action1'
import './App.css';
import {connect} from 'react-redux'
import Display from './Components/Displaylist'

const mapDispatchToProps=(dispatch)=>{
   return{
   submitHandler:(details)=>dispatch(action1(details))
   }
}

class App extends Component {

  state={
    FirstName:'', 
    LastName:'', 
    Age: '' 
 }


nameHandler=(event)=>{

    this.setState({[event.target.name]:event.target.value});
}

SubmitHandler=(event)=>{
   event.preventDefault()
   /*
   const firstname=this.state.details.FirstName
   const lastname=this.state.details.LastName
   const age=this.state.details.Age
   */
   this.props.submitHandler(this.state)
}

  render(){
  return (
    <div className="App">
     <form onSubmit={this.SubmitHandler}>
                  <div className="form-group">
                    <input 
                     type="text"
                     placeholder="FirstName"
                     value={this.state.FirstName}
                     onChange={this.nameHandler}
                     className="form-control"
                     name="FirstName"
                     />
                     </div>

                     <div className="form-group">
                     <input
                       type="text"
                       placeholder="LastName"
                       value={this.state.LastName}
                       onChange={this.nameHandler}
                       className="form-control"
                       name="LastName"
                       />
                     </div>

                     <div className="form-group">
                       <input
                       type="text"
                       placeholder="Age"
                       value={this.state.Age}
                       onChange={this.nameHandler}
                       className="form-control"
                       name="Age"
                       />
                        </div>
                        <div className="form-group">
                       <button type="submit" >Submit Form</button>
                       </div>
                </form>
              <Display/>
     </div>
  );
}
}




export default connect(null,mapDispatchToProps) (App);

//动作组件

import {SUBMISSION} from '../Constants/actiontypes'
import uuidv4 from 'uuid/v4'

export const action1=(body)=>{
    console.log(body)
 return{
     type:SUBMISSION,
     payload:{
     id:uuidv4(),
     body
     }
 }

}

//reducer 组件 -->即使我只有一个动作,我也在使用组合 reducer

import {SUBMISSION} from '../Constants/actiontypes'

const reducer1=(state=[],action)=>{

     if(action.type===SUBMISSION){

     return  [...state, action.payload];

   } 


    return state

}

export default reducer1

//合并reducer文件

import {combineReducers} from 'redux'
import Reducer1 from './reducer1'

const allreducers=combineReducers({details:Reducer1})
export default allreducers

//显示文件模板

const Display=({details:{firstname,lastname,age}})=>{

    return(
        <div >
            <h1>Firstname:{firstname}</h1>
            <h1>LastName:{lastname}</h1>
            <h1>Age:{age}</h1>
        </div>
    )
}

export default Display

//DisplayList 文件--> 我已经在这个文件中导入了Display.js(上图)文件。并通过这个文件传递值。最后我在我的 App.js 文件中导入了这个

import React from 'react'
import {connect} from 'react-redux'
import Display from './Display'

const mapStateToProps=(state)=>{
   return{
       details:state.details
   }
}

const List=({details})=>{
    console.log(details)
    return(
       <div>

      {details.map(de=>{
          console.log(de)
         return (
             <Display details={de} key ={de.id}/>
         )

      })}
      </div>
    )
}

export default connect(mapStateToProps,null)(List)

我无法显示我输入的值。

我得到了 FirstName : 姓: 年龄:

但不是它们对应的值。

【问题讨论】:

  • 使用redux时,不要使用本地状态。在 App.js 中,您正在更新 redux 状态,但显示本地状态。在 App.js 中编写一个 mapStateToProps 并显示 redux 状态。
  • 嗨 Dharmendra,检查我的解决方案,如果有帮助,请告诉我。

标签: redux react-redux


【解决方案1】:

你几乎明白了!问题在于您传递给 Display 组件的内容以及您如何解构道具。进行这些更改,它应该可以工作。

  1. 在 DisplayList 组件中,更改
<Display details={de} key={de.id}/> 

<Display details={de.body} key={de.id} />
  1. 在显示组件中,更改
const Display=({details:{firstname,lastname,age}})

const Display = ({ details: { FirstName: firstname, LastName: lastname, Age: age }})

这是一个代码框示例供您参考:

https://codesandbox.io/s/reactredux-obsht

如果您需要任何帮助,请告诉我。

【讨论】:

  • 它对我有用。你能详细说明一下为什么我需要在 Display 组件中使用 body 以及为什么我需要将道具解构为 {details:{FirstName:firstname} 为什么不 {details:{firstname}}
  • 在您的动作创建器中,当您在有效负载中传递数据时,您并没有提及“body”数据的变量名称,因此,它会创建一个“body”变量并存储里面的数据。如果要分配不同的变量名称,请像这样更新有效负载数据,有效负载:{ id:uuidv4(), formData: body } 并使用 details.formData。对于第二个问题,您需要使用别名解构,因为变量名称与详细信息对象数据不同。如果您不希望这样,只需更新变量名称 ({details: {FirstName}}) 和 Firstname: {FirstName}
  • 感谢您的解释。我现在清楚了。谢谢
【解决方案2】:

我认为问题在于您在reducer 中的初始状态,

const reducer1=(state=[],action)=>{  ...  }

React 中,我们有状态object,但您初始化了array,例如state=[]

您需要单独创建一个初始状态对象,例如,

const initialState = {
    details : []    //name it as `details`, because you are getting `state.details` in `DisplayList` component
}

现在您可以更新并返回您的状态,

const reducer1=(state=initialState, action)=>{

   if(action.type===SUBMISSION){
       return  {...state, details: [...state.details, action.payload] };
   } 

   return state
}

【讨论】:

  • 在 DisplayList 我使用 state.details 因为在 CombineReducer 文件中我将我的 reducer1 初始化为 details 。
  • 当您使用combineReducers({details:Reducer1}) 并使用namespace 访问状态时,您最终可以使用details.details.map(...) 从您的状态中迭代数组
  • 我尝试了 details.details.map 但它出错了。 TypeError:无法读取未定义的属性“地图”
  • 然后尝试使用普通reducer而不是combineReducer。
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多