【问题标题】:mapStateToProps makes props.{variable} undefined after state changemapStateToProps 在状态改变后使 props.{variable} 未定义
【发布时间】:2018-08-04 06:39:18
【问题描述】:

我正在使用 Redux 学习 React,遇到了这个问题,其中有两个连接的组件 - AvengerTable (Table) 和 AvengerTableRow (Row)。

AvengerTableRow 组件在AvengerTableRow 内部使用。我在AvengerTablemapStateToProps 并将该状态的一部分传递给每个AvengerTableRow 组件。在 AvengerTableRow 内部,我调度了一个动作来更改该特定 r 的值。但是现在,由于某种原因,我的AvengerTable 组件中的道具失去了由mapStateToProps 映射的状态,并且它变得未定义。

实际上,我在 reducer 中更改了部分状态,所以我认为它可能不会再次调用 render。所以我也尝试返回新状态。但即便如此,道具也会变得未定义。

AvengerTable 组件:

    render() {
            const tableRows = this.props.avengers.map(avenger => (
                <AvengerTableRow key={avenger.id} avenger={avenger} />)
            )

            return (
                <div><h2>Avengers List</h2>
                    <table className="table table-sm table-hover">
                        <thead className="thead-dark">
                            <tr>
                                <th>Name</th>
                                <th>Avenger Name</th>
                                <th>Action</th>
                            </tr>
                        </thead>
                        <tbody>
                            {tableRows}
                        </tbody>
                    </table>
                </div>
            )
        }

    const mapStateToProps = state => {
        return { avengers: state.homeReducer.avengers }
    };

AvengerTableRow 组件:

    render() {
        return (
            <tr>
                <td>{this.state.editable ? <input className="form-control" onChange={e => this.editChangeHandler(e, 'name')}
                    defaultValue={this.state.avenger.name} /> : this.state.avenger.name}</td>
                <td>{this.state.editable ? <input className="form-control" onChange={e => this.editChangeHandler(e, 'avengername')}
                    defaultValue={this.state.avenger.avengername} /> : this.state.avenger.avengername}</td>
                <td>
                    {this.state.editable ? <button onClick={this.saveAvenger} className="btn btn-sm btn-primary">Save</button> :
                        <button onClick={this.editContent} className="btn btn-sm btn-default">Edit</button>
                    }
                    &nbsp;
                    {this.state.editable ? <button onClick={this.cancelEdit} className="btn btn-sm btn-default">Cancel</button> :
                        <button className="btn btn-sm btn-danger">Delete</button>
                    }
                </td>
            </tr>
        )
    }
}

saveAvenger(e) {
    e.preventDefault();
    this.props.editAvenger(this.state.avenger);
    this.setState({
        originalAvenger: { ...this.state.avenger }
    });
    this.editContent();
}

const mapDispatchToProps = dispatch => ({ editAvenger: avenger => dispatch(editAvenger(avenger)) })

减速机:

......
case homeActionTypes.EDIT_AVENGER: {
    return state.avengers.map(avenger =>
        avenger.id == action.payload.id ? ({ ...avenger, name: action.payload.name, avengername: action.payload.avengername }) : avenger)
}
......

AvengerTableRow 中的 dispatch 完成后,我在 AvengerTable 中的 props 是这样的:

​{
   avengers: undefined,
   dispatch: function dispatch(),
   __proto__: Object { … }
}

请帮助我理解

  1. 为什么我的道具avengersprops里面变得未定义,即使 状态正在减速器中返回。
  2. 另外,即使 dispatch 没有异步运行,为什么 props 会丢失之前渲染中设置的状态?
  3. 即使connect 没有检测到由于状态的浅层变化而导致的状态变化,为什么它会丢失其已经映射到 props 的状态?

【问题讨论】:

  • 你必须在州内更新复仇者联盟。

标签: reactjs redux react-redux


【解决方案1】:

要从商店返回更新后的数组,您需要更新您的状态,而不是直接更新您目前所做的。

case homeActionTypes.EDIT_AVENGER: {
        return {...state , avengers : state.avengers.map(avenger =>
            avenger.id == action.payload.id ? ({ ...avenger, name: action.payload.name, avengername: action.payload.avengername }) : avenger)
    }
    }

【讨论】:

  • 是的,现在道具已加载。我已将商店添加到窗口对象,以便从浏览器控制台进行调试。在我改变状态后,当我执行store.getState() 时,我无法在商店中找到更新的状态。它不应该还是应该更新?
  • @v1shnu 你检查过你的组件显示更新状态吗?
  • yes.. 组件现在显示更新状态。但是为什么store.getState()返回的状态没有更新呢?
  • 您可以在控制台日志中查看 redux 中间件日志所有状态更新。您将清楚地了解存储更新
  • 嗯好的..感谢您的帮助。您能否编辑您的答案并提供一些解释,以便我接受您的答案。
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 2016-12-22
  • 2020-10-16
  • 2019-11-15
  • 2021-01-27
  • 1970-01-01
  • 2016-09-19
  • 2017-05-31
相关资源
最近更新 更多