【问题标题】:Error while replacing string with array in react state在反应状态下用数组替换字符串时出错
【发布时间】:2017-02-13 21:20:30
【问题描述】:

我有下面的反应代码,当变量日志是字符串时它可以正常工作,即注释代码,但是一旦我用数组替换日志,我就会收到错误,

import React from "react";
export default class WelcomeComponent extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        // logs :''
        logs: []
    };
}
componentDidMount() {
    var socket = io('http://localhost:11001');
    socket.on('news', (data) => {
        data = JSON.parse(data);
        this.setState({
            logs: this.state.logs.push(data)
            // logs: data + this.state.logs
        });
    });
}
render() {
    return (<div> {this.state.logs}</div>);
}
}

将日志作为数组会给出以下错误,

未捕获的类型错误:_this2.state.logs.push 不是函数(…)

谁能帮忙。

【问题讨论】:

  • 如果您在componentDidMount 中执行console.log(this.state.logs),它会返回什么?
  • 它显示为 1,但不知道为什么
  • 您将日志设置为.push() 的结果,这将是数组的长度,因此它被设置为一个数字。下次您尝试更新状态时,您将调用 push 以获取数字和错误。

标签: javascript arrays reactjs react-redux


【解决方案1】:

尝试使用不变性方法:

 socket.on('news', (data) => {
        data = JSON.parse(data);
        const newLogs = [...this.state.logs, data]
        this.setState({
            logs: newLogs
            // logs: data + this.state.logs
        });
    });

【讨论】:

【解决方案2】:

您正在直接改变组件的状态,这是一个很大的问题。试试React Immutability Helpers

import React from "react";
import update from 'react-addons-update';

export default class WelcomeComponent extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        // logs :''
        logs: []
    };
}
componentDidMount() {
    var socket = io('http://localhost:11001');
    socket.on('news', (data) => {
        data = JSON.parse(data);
        this.setState({
            logs: update(this.state.logs, {$push: [data]});
        });
    });
}
render() {
    return (<div> {this.state.logs}</div>);
}
}

【讨论】:

  • 谢谢Shota。性能方面,使用更新或不变性方法(如上面建议的 rob)更喜欢什么。我目前正在阅读文档并关注它,我想它需要更深入的研究。
  • 如果您没有真正构建需要非常专门的性能优化的东西,您无需担心。否则,如果您想有一些非常专用的解决方案,请查看:facebook.github.io/immutable-js
猜你喜欢
  • 2017-02-14
  • 2016-07-24
  • 2017-05-24
  • 2021-10-03
  • 1970-01-01
  • 2014-03-21
  • 2020-06-05
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多