2017-09-09 5 views
0

入力ボックスとタイトルを持つアプリケーションをセットアップしました。タイトル入力はonChangeに変更され、タイトルが更新されます。状態は配列{title:[{title: 'Welcome', feature: 'test'}]を持つオブジェクトです。タイトルにsetStateが正常に機能しましたが、機能が不明になりました。 、header.jsが親で、ReactJS - .setStateが正常に呼び出された後、他のプロパティが定義されなくなる

import React from "react"; 

export default class Title extends React.Component { 
    render() { 
    return (
     <h1>{this.props.title}</h1> 
    ); 
    }} 

import React from "react"; 
import Header from "./Header"; 

export default class Layout extends React.Component { 
    constructor() { 
    super(); 
    this.state = { 
     title: [{ 
     title: 'Welcome', 
     feature: 'test' 
     }] 
    }; 
    } 

    changeTitle(titleChange) { 
    this.setState({title: [{title: titleChange }]}); 
    } 

    render() { 
    return (
     <div> 
     <Header changeTitle={this.changeTitle.bind(this)} title={this.state.title[0].title} feature={this.state.title[0].feature} /> 
     </div> 
    ); 
    } 
} 

HEADER.JS

import React from "react"; 
import Title from "./Header/Title"; 

export default class Header extends React.Component { 
    handleChange(e) { 
    const title = e.target.value; 
    console.log(e, title); 
    this.props.changeTitle(title); 
    } 

    render() { 
    console.log(this.props.title) //This test Works 
    console.log(this.props.feature) //This test Works 
    return (
     <div> 
     <Title title={this.props.title} /> 
     <h4> Feature Here: {this.props.feature} </h4> //This disappears after I change input 
     Title Here: <input value={this.props.title} onChange={this.handleChange.bind(this)} /> 
     </div> 
    ); 
    } 
} 

TITLE.JS

だからメインですapp.js APP.JS:コードを参照してください。 title.jsは子供です(私が正しく理解していれば)。

undefinedになるので、titlenew titleであるため、変更した後。どのようなアイデアが間違っている? componentWillUpdateを使用する必要があるかもしれませんが、私はどうしたらいいか分かりません。

+1

'this.setState({タイトル:[{タイトル:titleChange、特徴:this.state.title [0] .featureを} ]}); ' – Jayce444

+2

また、Andyが言ったことを繰り返し述べると、州を「複雑にする」と言ったとき、彼は難しく複雑であるという意味ではなく、面倒で扱いにくいという意味です。あなたの質問に基づいて、あなたはReactで多くの経験がないように見えるので、できるだけシンプルな状態を作ることは、たくさんのところであなたを助けます。 1つの要素を持つ配列である 'title'プロパティは、2つのプロパティを持つオブジェクトで、そのうちの1つはやはり 'title'です。ちょうど奇妙で乱雑です。ちょうどあなたが状態で保存する必要があり、それをどのように保存する必要があるのか​​考えるのに少し時間を費やすのが良いでしょう – Jayce444

+1

ああ私はあなたに全く同感です!そして私はこれで新しいです。このセットアップは** no ** senseとなっていますが、私が完全なデザインを説明していれば、それはします(編集:私はそうすると思います)。しかし、Jayceのコードがうまくいってくれてありがとう!ほんとうにありがとう! –

答えて

3

それはあなたがだけインナーtitle財産、ないfeaturetitle配列の卸売を交換しているsetStateときためです。あなたのヘッダーを

changeTitle(titleChange) { 
    this.setState({ title: titleChange }); 
} 

とビルド:

this.state = { title: 'Welcome', feature: 'test' }; 

はその後の状態を設定します。あなたはこのような複雑な状態を持つための特別な理由がない限り、私はあなただけのオブジェクトを使用することによって、それはあまり問題にするべきだと思います。

<Header 
    changeTitle={this.changeTitle.bind(this)} 
    title={this.state.title} 
    feature={this.state.feature} 
/> 

次に行く与える何らかの理由であなたの状態の構造を変更できない場合:

this.setState(Object.assign({}, this.state.title[0], { title: titleChange })); 

おそらくObject.assignなしでそれを書くためのより簡潔な方法がありますが、正しくテストすることはできません。ただし、上記のコードはdoes workです。

編集

これは、トリックを行う必要があります。

this.setState({ ...this.state.title[0], title: 'a' }); 
+0

ちょっとアンディ、ありがとう、私はそれを複雑にする理由があります(これは私が実際に開発しているものに必要なものです)。私は 'this.setState({title:{{title:title1}、{feature: 'test-2'}}})'を使用しましたが、フィーチャーは指定されていますが未だ定義されていません:/ –

+0

@ケビン・ダニコフスキーは、私の答えを修正して、あなたを正しい道に導くはずです。 – Andy

+1

アンディさん、本当にありがとう!そのため、Jayce444のコードは何らかの理由で「状態は定義されていません」と述べましたが、私はあなたがより良い方法で私を導いたと信じていますが、Jayceのものは今のところうまくいくでしょう、ありがとうほんとうにありがとう! –

2

設定状態を実行しているときは、残りのプロパティではなくタイトルのみを指定しているため、未定義に設定されています。

拡散操作を使用すると、この操作に役立ちます(アクセス権がある場合)。

this.setState((prevState, props) => { 
    return {...prevState, title: [{title: titleChange }]}; 
}); 

そうでない場合は、状態に設定したオブジェクトに他のすべての値を含めてください。

+0

こんにちはk2Snowman69、私はそれを感謝し、私も機能を指定しようとし、それは動作しませんでした。私はあなたの方法を試しましたが、エラーはありませんでしたが、問題は修正されませんでした(機能は未定義です):/その他のアイデア?ありがとうございました –

+1

申し訳ありませんが、私のコンピュータから離れて寝ました...他の答えがかなりあなたを得たように見えます!がんばろう! – k2snowman69

関連する問題