Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Redux不会一次向存储区发送2个属性_Javascript_Reactjs_Redux_React Redux_React State - Fatal编程技术网

Javascript Redux不会一次向存储区发送2个属性

Javascript Redux不会一次向存储区发送2个属性,javascript,reactjs,redux,react-redux,react-state,Javascript,Reactjs,Redux,React Redux,React State,我是新手。我有一个初始状态为2个属性的减速器 我从一个组件向存储区发送数据,但只传递了一个属性——时间或日期。但我两个都要送 我试着做async/await,认为解释器的时间不够了——尽管它没有那么合乎逻辑,但我试过了。这对我没有帮助。我还认为Redux不能接受对象,但我研究并发现它可以。然后我向自己证明它真的可以——我只是简单地发送了1个属性 下面是代码片段 *Reducer: * const initialState = { date: {}, time: {} } const

我是新手。我有一个初始状态为2个属性的减速器

我从一个组件向存储区发送数据,但只传递了一个属性——时间或日期。但我两个都要送

我试着做async/await,认为解释器的时间不够了——尽管它没有那么合乎逻辑,但我试过了。这对我没有帮助。我还认为Redux不能接受对象,但我研究并发现它可以。然后我向自己证明它真的可以——我只是简单地发送了1个属性

下面是代码片段

*Reducer: *

const initialState = {
  date: {},
  time: {}
}

const dateTimeReducer = (state = initialState, action) => {
    switch (action.type) {
        case 'setDate':
            return {
                date: action.payload,
            }

        case 'setPickedCell':
            return {
                time: action.payload,
            }

        default:
            return state
    }
}
export default dateTimeReducer

*组件-我将简化,条件是我没有语法错误,并且当我只将2个属性中的1个发送到Redux存储时,代码可以工作*
从“”导入日期
从“”导入时间
类Comp.Component{
状态={
日期:{…},
时间:{…}//在渲染周期中已通过函数设置了日期和时间
//acceptStateFromDate和acceptStateFromTime
}
acceptStateFromDate(){
this.setState({date:stateData})
} 
//与acceptStateFromTime相同-这些函数用于从子组件获取状态数据,并在componentDidMount时调用
acceptStateFromTime(){
...
}
onConfirmClick=()=>{
this.props.isAllowedHandler()
this.props.onDateSet(this.state.datePicker)
this.props.onCellSet(this.state.timePicker)
}
componentDidMount(){
acceptStateFromDate()
acceptStateFromTime()
} 
render(){
返回(
证实
)
}
}
函数MapStateTops(状态){
返回{
日期:state.dateTime.date,
时间:state.dateTime.time,
}
}
功能图DispatchToprops(调度){
返回{
onDateSet:(val)=>dispatch({type:'setDate',payload:val}),
onCellSet:(val)=>dispatch({type:'setPickedCell',payload:val}),
}
}
导出默认连接(mapStateToProps、mapDispatchToProps)(带路由器(约会))
所有导出和导入都存在于我的代码中

因此,如果我只通过
onConfirmClick
发送
this.props.onDateSet({someObj})``,我将进入我的Redux状态
date:{someObj}
。时间也是一样-我会得到时间:{someObj}`

但是如果我把这两个道具放在一起,只有一个会送到商店

我猜问题比逻辑更深层,可能我在React系统或Redux方面都不够好

有人知道问题出在哪里吗


提前谢谢

您的减速机错误,您也必须返回
状态。目前,您正在完全重写它:

返回{
日期:action.payload,
}
将您的返回声明更改为以下内容:

返回{
……国家,
日期:action.payload,
}

const dateTimeReducer=(state=initialState,action)=>{
开关(动作类型){
案例“设置日期”:
返回{
……国家,
日期:action.payload,
}
案例“setPickedCell”:
返回{
……国家,
时间:action.payload,
}
违约:
返回状态
}
}

您的减速器错误,您也必须返回
状态。目前,您正在完全重写它:

返回{
日期:action.payload,
}
将您的返回声明更改为以下内容:

返回{
……国家,
日期:action.payload,
}

const dateTimeReducer=(state=initialState,action)=>{
开关(动作类型){
案例“设置日期”:
返回{
……国家,
日期:action.payload,
}
案例“setPickedCell”:
返回{
……国家,
时间:action.payload,
}
违约:
返回状态
}
}

完全正确!没有添加状态本身,redux正在更新状态,只留下最后发送的属性。我认为我们不需要编写状态-我认为redux通过在找到action.type的情况下更新状态来实现这一点。谢谢确切地没有添加状态本身,redux正在更新状态,只留下最后发送的属性。我认为我们不需要编写状态-我认为redux通过在找到action.type的情况下更新状态来实现这一点。谢谢
*index.js*

import React from 'react'
import ReactDOM from 'react-dom'
import './css/style.comp.css'
import App from './App'
import { BrowserRouter } from 'react-router-dom'
import store from './redux/store'
import { Provider } from 'react-redux'
// import rootReducer from './redux/rootReducer'

// const store = createStore(rootReducer)

ReactDOM.render(
    <Provider store={store}>
        <BrowserRouter>
            <App />
        </BrowserRouter>
    </Provider>,

    document.getElementById('root')
)

*store.js*

import { createStore } from 'redux'
import rootReducer from './rootReducer'

const store = createStore(rootReducer)

export default store

*rootReducer.js*

import { combineReducers } from 'redux'
import dateTime from './reducers/dateTime'

export default combineReducers({ dateTime })

*Component - I will simplify, with a condition that I have no syntax mistakes and the code works when I send only 1 of 2 properties to a Redux store*

import Date from ''
import Time from ''

class Comp extends React.Component {
  state = {
     date: {...}, 
     time: {...} // both date and time already set during rendering cycle - through a function 
                 // acceptStateFromDate and acceptStateFromTime
  }

  acceptStateFromDate() {
    this.setState({ date: stateData })
  } 

  // same about acceptStateFromTime - those functions are used to get state data from a child component and are called while componentDidMount

  acceptStateFromTime() {
    ...
  }

  onConfirmClick = () => {
    this.props.isAllowedHandler()
    this.props.onDateSet(this.state.datePicker)
    this.props.onCellSet(this.state.timePicker)
  }

  componentDidMount() {
    acceptStateFromDate() 
    acceptStateFromTime()
  } 

  render() {
    return (
      <div> 
        <div onClick={this.onConfirmClick}> Confirm </div>
        <Time sendState={acceptStateFromTime} />
        <Date sendState={acceptStateFromDate} />
    )
  }
}

function mapStateToProps(state) {
    return {
        date: state.dateTime.date,
        time: state.dateTime.time,
    }
}

function mapDispatchToProps(dispatch) {
    return {
        onDateSet: (val) => dispatch({ type: 'setDate', payload: val }),
        onCellSet: (val) => dispatch({ type: 'setPickedCell', payload: val }),
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(withRouter(Appointment))