gpt4 book ai didi

reactjs - 将元素推送到数组时 react setstate不起作用

转载 作者:行者123 更新时间:2023-12-04 17:49:08 24 4
gpt4 key购买 nike

我正在尝试将元素推送到组件状态中的对象数组(在 react.js 中),我正在调用方法 Array.concat 返回一个新数组。

pushDeck(id, name) {
var newDeck = [{
id: id,
name: name
}];
console.log("new path should be: ", this.state.path.concat(newDeck));
this.setState({
path: this.state.path.concat(newDeck)
}, () => {
console.log("setstate callback: ", this.state.path);
});
}

第一个 console.log 打印路径数组的正确值,但在调用 setstate 的回调后,第二个 console.log 打印一个空数组。就像 this.setState 什么都没做一样

更多详情:我从 grandChild 组件调用 pushDeck,我将函数 pushDeck 作为组件 DeckGallery 的 Prop 提供,而这个组件将函数提供给它的一个子组件。这是整个主要组件:

import React, {Component} from "react";
import Page from "../components/page.jsx";
import Radium from "radium";
import {connect} from "react-redux";
import {getUserInfo} from "../actions/user";
import {successAlert} from "../actions/alerts";
import {fetchUserDecks, deleteUserDeck} from "../actions/deck.js";
import RaisedButton from 'material-ui/RaisedButton';
import CreateUserDeckContainer from "../containers/createUserDeckContainer.jsx";
import DeckGallery from "../components/deckGallery.jsx";
import _ from "lodash";

const style = {
row1:{
margin: "5px"
},
path:{
color: "blue",
cursor: "pointer"
}
}


class Home extends Component{

constructor(props){
console.log("home constructor");
super(props);
this.state = {parentId:null, path:[]};
this.fetchDecks = this.fetchDecks.bind(this);
this.renderPath = this.renderPath.bind(this);
this.goToIndex = this.goToIndex.bind(this);
this.onDelete = this.onDelete.bind(this);
this.pushDeck = this.pushDeck.bind(this);
}

componentWillMount(){
console.log("will mount");
this.props.getUserInfo();
}

fetchDecks(skip){
console.log("fetch decks");
this.props.fetchUserDecks(this.state.parentId, skip, this.state.path);
}

goToIndex(pathLastIndex){
console.log("goto index", this.state.path);
var limitToDrop = this.state.path.length - pathLastIndex;
var newPath = _.dropRight(this.state.path, limitToDrop);
this.setState({path: newPath});
}

pushDeck(id, name){
var newDeck = [{id: id, name: name}];
console.log("new path should be: ", Array.from(new Set(this.state.path.concat(newDeck))));
this.setState({path: Array.from(new Set(this.state.path.concat(newDeck)))},
()=>{
console.log("setstate callback: ", this.state.path);
});
}

componentWillUpdate(nextProps, nextState){
console.log("nextstate: ", nextState);
}

renderPath(){
return (
<div>
<span onClick={()=>this.goToIndex(0)} style={style.path}>Root</span>
{this.state.path.map((p, i)=>{
<span key={(i+1)} onClick={()=>this.goToIndex(i+1)} style={style.path}>{p.name}</span>
})
}
</div>
);
}

onDelete(deckId){
console.log("on delete");
this.props.deleteUserDeck(deckId, this.state.path, ()=>{
this.props.successAlert("Deck deleted succesfully !");
this.forceUpdate();
});
}

render(){
console.log("path at render: ", this.state.path);
return (
<Page name="my collection">
<div className="container">
<div style={style.row1} className="row">
<div className="col-lg-9 col-sm-6">
<h2>Your decks</h2>
Path: {this.renderPath()}
</div>
<div className="col-lg-3 col-sm-6">
<CreateUserDeckContainer path={this.state.path}/>
</div>
</div>
<div className="row">
<div className="col">
<DeckGallery pushDeck={this.pushDeck} onDelete={this.onDelete} path={this.state.path} fetch={this.fetchDecks} decks={this.props.decks}/>
</div>
</div>
</div>
</Page>
);
}
}

function mapStateToProps(state){
return {decks: state.userDecks};
}

export default connect(mapStateToProps, {getUserInfo, fetchUserDecks, deleteUserDeck, successAlert})(Radium(Home));

更新:我将错误隔离为:

goToIndex(that){
console.log("path at gotoindex: "+ JSON.stringify(that.state.path));
}

renderPath(){
var that = this;
console.log("path at renderpath: "+ JSON.stringify(that.state.path));
setTimeout(()=>{
that.goToIndex(that);
}, 0);
that.goToIndex(that);
}

当我调用 render 时,这是在控制台中打印的内容:

path at renderpath: [{"id":"59cec39e3724bc137d935ed5","name":"math"}]
path at gotoindex: [{"id":"59cec39e3724bc137d935ed5","name":"math"}]
path at gotoindex: []

最后一行是在 setTimeout 内部调用 goToIndex 时打印的,它应该打印与在 setTimeout 外部调用时相同的内容。此外,我在 componentWillUpdate 中放置了一个 console.log 以查看状态是否在两次调用中间发生变化但没有发生。

最佳答案

this 与您对回调的想法无关。

用箭头语法声明你的函数可能会解决这个问题。

检查 this answer ,我认为这可能会有所帮助。

关于reactjs - 将元素推送到数组时 react setstate不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46518155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com