2017-02-13 61 views
0

我有以下作用的代码,它工作正常时可变日志是字符串,即注释的代码,但只要我跟阵列代替原木我正在错误,错误而在阵列替换字符串反应状态

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不是一个函数(...)

任何人都可以请帮助。

+0

如果你做一个'的console.log(this.state.logs)'在'componentDidMount',这是什么回报? – finalfreq

+0

它显示为1,不知道为什么 – Akash

+0

您将日志设置为'.push()'的结果,这将是数组的长度,因此它被设置为一个数字。当你下次尝试更新状态时,你会在数字和错误上调用'push'。 –

回答

2

尝试使用不变性方法:

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

工作,谢谢。我在下面,https://facebook.github.io/react/docs/state-and-lifecycle.html不知道原因,我会再次阅读文档。 – Akash

+0

接受我的答案,因为他们正确的PLZ:D – Robsonsjre

0

您直接突变的成分,这是一个很大都能跟得上的状态。尝试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>); 
} 
} 
+0

感谢Shota。性能明智的更喜欢使用像上面提到的rob更新或不可变性方法。我目前正在阅读文档并跟随它,我想这需要更深入的潜水。 – Akash

+0

如果你不是真的需要非常专注的性能优化,你不需要担心它。否则,如果你想有一些非常专业的解决方案,请看看:https://facebook.github.io/immutable-js/ – Shota