2017-06-26 17 views
0

、(成分コンストラクタで、初期化時)成分国有財産等の非空の配列を設定しようとし、例えば、のような:このエラーがコンソールに返され配列を反応コンポーネントの状態プロパティとして割り当てるか?

this.state = { results: ['apple','orange'] } //in the component constructor 

この環境では割り当てのための情報源は、アレイがが空の場合という、対応

をスペックobject.This エラーがパフォーマンスの最適化であることと、してはいけません作品(しかし、すぐにあなたが非空の配列をreasignしようとして、それはバグでしょう)

だから、この作品:

this.state = { results: [] } //in the component constructor 

以前のエラー時点で

this.setState({results: ['apple','orange'] }) //in a component function 

を行うまで、返品させていただきます...

私は分かりません。 javascript配列も型オブジェクトであると想定されているので、状態プロパティ値として使用できませんか?

私はアンドロイドデバイスで最新の反応ネイティブバージョン(0.45.1)でテストしました。

state.resultsオブジェクトは唯一このようなリストビューで使用されています

const ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 }) 

    render() { 
    return (

    <ListView 
       style={{position: 'absolute', width: 100, backgroundColor: 'white', zIndex: 3}} 
       keyboardShouldPersistTaps='always' 
       initialListSize={15} 
       enableEmptySections={true} 
       dataSource={ds.cloneWithRows(this.state.results)} 
       renderRow={(rowData, sectionId, rowId, highlightRow) => 
       <RowWrapper styles={styles.rowWrapper} > 
        <TouchableOpacity 
        activeOpacity={0.5} 
        onPress={() => {this.onItemPress(this.state.results[rowId])}} 
        > 
        <Text style={styles.rowText}>{rowData}</Text> 
        </TouchableOpacity> 
       </RowWrapper> 
       } 
      /> 
    ) 
    } 

    class RowWrapper extends Component { 
     constructor (props) { 
     super(props) 
     this.defaultTransitionDuration = 500 
     this.state = { 
      opacity: new Animated.Value(0) 
     } 
     } 
     componentDidMount() { 
     Animated.timing(this.state.opacity, { 
      toValue: 1, 
      duration: this.defaultTransitionDuration 
     }).start() 
     } 
     render() { 
     return (
      <TouchableWithoutFeedback> 
      <Animated.View style={{...this.props.styles, opacity: this.state.opacity }}> 
       {this.props.children} 
      </Animated.View> 
      </TouchableWithoutFeedback> 
     ) 
     } 
    } 
+0

をやるべき

this.setState({results: ['apple','orange'] }) 

をやってねえ、あなたはより多くのコードを投稿することができますか?投稿した内容は正常に動作するはずですので、エラーはあなたのコード内にあるものだと思います。あなたはthis.state.resultsを使ってどこにでもObject.assignをどこにでも投稿していますか?ありがとう –

+0

@MattAft。私はthis.state.resultsを使用しているコードの部分で私の最初の投稿を編集しました。私はObject.assignをどこにも使わず、listviewはthis.state.resultsが読み込まれるコードの唯一の部分です(そうでなければthis.state = {results:[]}を持つコンポーネントコンストラクタにのみ表示され、 this.setState({results:['apple'、 'orange']})で上書きされるコンポーネント関数ですが、問題の発生場所は...) –

答えて

0

あなたは状態を変異させるべきではありません。 の代わりに、あなたは

var resultsArr = this.state.results.slice(); 
var newResults = ['apple','orange']; 
resultsArr.concat(newResults); or resultsArr.push(newResults); 
this.setState({results: resultsArr }) 
+0

これを呼び出すときに状態を直接変更しません.setState()は、引数で渡されたものをコンポーネントの状態とマージすることになっています... 私は何の違いが見えません: var newResults = ['apple'、 'orange']; this.setState({results:newResults}) と var resultsArr = this.state.results.slice(); var newResults = ['apple'、 'orange']; resultsArr.concat(newResults); this.setState({results:resultsArr}) exeptが不要な空のテンポラリ配列を作成しています... –

+0

とにかく、あなたのコードでは問題が解決されず、エラーが発生します。空の配列も。だから、これは状態を変えることに関連しているとは関係ありません。 –

+0

これを試すことができますか: 'this.setState({results:[this.state.results。 es6 'this.setState({結果:[... this.state.results、... ['apple'、 'orange']] }) ' – Etherealm

関連する問題