2017-08-23 3 views
-1

Reactでちょうど降りてください。小道具はアクセス可能に見える。 Inventory.jsの "this"が気に入らないようです。私は間違って何をしていますか?Reactで小道にアクセスする:プロパティを読み取ることができません***未定義の

App.js

import React, { Component } from 'react'; 
import logo from './logo.svg'; 
import './App.css'; 
import Inventory from './Inventory'; 
import ChangeForm from './ChangeForm'; 

class App extends Component { 
    constructor() { 
    super(); 

    this.addEntryToState = this.addEntryToState.bind(this); 

    this.state = { 
     entries: {}, 
    }; 
    } 

    addEntryToState(entry) { 
    const entries = {...this.state.entries}; 
    const timestamp = Date.now(); 
    entries[`entry-${timestamp}`] = entry; 
    this.setState({ entries: entries }) 
    } 

    render() { 
    return (
     <div className="App"> 
     <div className="App-header"> 
      <img src={logo} className="App-logo" alt="logo" /> 
      <h2>Welcome to React</h2> 
     </div> 
     <p className="App-intro"> 
      To get started, edit <code>src/App.js</code> and save to reload. 
     </p> 
     <ChangeForm addEntryToState={this.addEntryToState} entries={this.state.entries} /> 
     <Inventory entries={this.state.entries} /> 
     <p></p> 
     </div> 
    ); 
    } 
} 

export default App; 

Inventory.js

import React from 'react'; 

class Inventory extends React.Component { 

    render() { 
    return (

     <div> 
     <h2>Inventory</h2> 
     <p>{this.props.entries[0].name</p> 
     <p>{this.props.entries <-----*********** how to display? ****}</p> 
     <p>table removed because errors</p> 

     </div> 
    ) 
    } 
} 

export default Inventory; 

ChangeForm.js

import React from 'react'; 

class ChangeForm extends React.Component { 
    createEntry(event) { 
    event.preventDefault(); 
    const entry = { 
     name: this.name.value, 
     quantity: this.quantity.value, 
     size: this.size.value, 
    } 
    this.props.addEntryToState(entry); 
    this.changeForm.reset(); 

    } 

    render() { 
    return (
     <div> 
     <h2>Change Form</h2> 
     <form ref={(input) => this.changeForm = input} onSubmit={(e) => this.createEntry(e)}> 
      <input ref={(input) => this.name = input} type="text" placeholder="name" /> 
      <input ref={(input) => this.quantity = input} type="text" placeholder="quantity" /> 
      <input ref={(input) => this.size = input} type="text" placeholder="size" /> 
      <button type="submit">Submit</button> 
     </form> 

     </div> 
    ) 
    } 
} 

export default ChangeForm; 

エラーメッセージ:

TypeError: Cannot read property 'name' of undefined Inventory.render src/Inventory.js:11

8 | 
    9 | <div> 
    10 | <h2>Inventory</h2> 
> 11 | <p>{this.props.entries[0].name}</p> 
    12 | <p>table removed because errors</p> 
    13 | 
    14 | </div> 

View compiled ▶ 26 stack frames were collapsed. Object../src/index.js src/index.js:7

4 | import App from './App'; 
    5 | import registerServiceWorker from './registerServiceWorker'; 
    6 | 
> 7 | ReactDOM.render(<App />, document.getElementById('root')); 
    8 | registerServiceWorker(); 
    9 | 
    10 | 
+0

this.props.entries [0] ''定義されていないので、あなたはそのエラーを取得しています。そのプロパティを、 'name'プロパティを持つオブジェクトの空でない配列に設定していますか? – TW80000

+0

'entries'をオブジェクトではなく*配列*として設定しましたか? – Li357

+0

エントリオブジェクトをDOMに吐き出して、それが理にかなっていると、それがWebページ上で変化するのを見ることができるようにしたいと思います。どうすればいい?それを配列に変換しますか?最初のthis.state = {entries:{}、}に問題がある可能性があります。 – bjorn

答えて

0

entries小道具がオブジェクトではなく、配列に設定されているので、あなたは、エラーを取得しています。

、App.jsを参照してください。エントリはオブジェクトであり、配列ではありません。代わりにentriesになるようにコードを修正する必要があります。

例:

this.state = { 
    entries: [], 
}; 
+0

この変更を組み込むと、Inventory.jsでも同じエラーが表示されます。TypeError:未定義のプロパティ 'name'を読み取れません。 「this」は赤で強調表示されます。 – bjorn

+0

空の配列の要素0が定義されていないため、配列が空の場合でもエラーが発生します。配列にデータが設定されていることを確認しましたか?空の配列の場合も処理する必要があります。 – TW80000

関連する問題