React Native:无法使用 this.setState() 在二维数组中设置变量,但 this.state.x= 有效

React Native: Can't use this.setState() to set a variable inside a 2D array, but this.state.x= works

我有一个二维对象数组,其中 key/value 对作为状态变量,我正在尝试使用推荐的 setting/changing 状态变量方式,即使用 this.setState({x:y}) 而不是直接使用 this.state.x = y 然后 forceUpdate() 设置它。但是,当我尝试这样做时,它给了我一个 "unexpected token" 错误。

我基本上想将变量从一种状态翻转到另一种状态,所以我使用了三元运算符。此代码有效

toggleBookmark(category, index) {   
    this.state.menuItems[category][index].bmIcon = (this.state.menuItems[category][index].bmIcon === "bookmark-o") ? "bookmark" : "bookmark-o";
}

这段代码,我希望做同样的事情,给出了一个错误

toggleBookmark(category, index) {   
    this.setState({menuItems[category][index].bmIcon: (this.state.menuItems[category][index].bmIcon === "bookmark-o") ? "bookmark" : "bookmark-o"});
}

我认为它可能是三元运算符,所以我将值放入一个变量并尝试用它设置状态变量,但它仍然给出相同的错误。

toggleBookmark(category, index) {
    var iconText = (this.state.menuItems[category][index].bmIcon === "bookmark-o") ? "bookmark" : "bookmark-o";
    this.setState({menuItems[category][index].bmIcon: iconText});
}

我是不是做错了什么? setState() 我想做的事可行吗?

在 Javascript 中,在内联创建对象时不能使用表达式作为对象的键。

这里的问题是你已经完成了 {menuItems[category][index].bmIcon: iconText} 这将引发语法错误。

如果您想快速解决这个问题,您可以先创建对象,然后将值分配给该键,如下所示:

var state = {}; state[menuItems[category][index].bmIcon] = iconText; this.setState(state);

但值得注意的是,ES6 提供了一个糖来做这件事,这里还有另一个答案可能会提供更多见解 How do I create a dynamic key to be added to a JavaScript object variable

更新:

我现在明白你的意思了,我之前假设 menuItems 已经定义了,但你想要做的是更改 this.state[=17= 中的嵌套对象内的键值]

这不是 React 真正构建的目的,您应该保持状态相对简单,并为每个菜单项制作单独的 React 组件,然后让它们管理自己的状态。我强烈推荐这种方法,因为它会让你的代码保持干净和健壮。不要害怕制作更多的组件!

但是,如果您确实想将所有这些嵌套状态保留在一个组件中(不建议),那么您应该首先复制您想要 setState 的对象。

var newMenuItems = _.clone(this.state.menuItems);
var iconText = (this.state.menuItems[category][index].bmIcon === "bookmark-o") ? "bookmark" : "bookmark-o";
newMenuItems[category][index].bmIcon = iconText;

this.setState({ menuItems: newMenuItems });

var iconText = (this.state.menuItems[category][index].bmIcon === "bookmark-o") ? "bookmark" : "bookmark-o";
this.state.menuItems[category][index].bmIcon = iconText;

this.forceUpdate();

(首选第一种方法,但需要安装 underscore 或 lodash 之类的东西)

我有数据聊天:

chat: {
        id: 'ss3k5e6j1-6shhd6-sdasd3d3-23d5-gh67',
        agentName: 'egaliciar',
        agentAvatar: 'http://i.imgur.com/DY6gND0.png',
        messages: [
          {
            id: 1,
            lines: [
              'Me pueden ayudar?',
              'Tengo problemas con mis boletos',
              'Hola buen dia...',
            ],
            time: '17:20',
          },
          {
            id: 2,
            lines: ['¿Me podria regalar su nombres', 'Con gusto...'],
            time: '17:22',
            date: '23/ene/2012',
          },
        ],
      },
    };

当我这样做时

const oldLines =Object.assign({}, this.state.chat);
    oldLines.messages[0].lines.push('newValue');

我的状态改变了......没有this.setState({});

我做了一个克隆人;

var clone = JSON.parse(JSON.stringify(this.state.chat)); 
        clone.messages[0].lines.push('new Value');

和国家保持他们的状态; 因此,完整的解决方案适合我:

var clone = JSON.parse(JSON.stringify(this.state.chat)); 
        clone.messages[0].lines.push(questionAreaMessage); //the state maintains
        this.setState({chat:clone}); //here the State change!!!!