2016-12-17 1 views
2

Reactを使用する非常に単純なMeteorアプリでは、Meteor.usersコレクションの登録ユーザーをすべて一覧表示するテーブルがあります。Meteor React Error:未定義のプロパティ '0'を読み取ることができません

ただし、各ユーザーの電子メールアドレスを表示しようとすると、HTMLページに電子メールアドレスが正しく表示されますが、ブラウザのJSコンソールで次のエラーが発生します。

Exception from Tracker recompute function: 
TypeError: Cannot read property '0' of undefined 
    at Users.render (User.jsx:8) 

このエラーはなぜ発生しますか?

/imports/ui/User.jsx

import React, { Component } from 'react'; 

export default class Users extends Component { 
    render() { 
     return (
      <tr> 
       <td>{ this.props.user._id}</td> 
       <td>{ this.props.user.emails[0].address }</td> // this is line 8 
      </tr> 
     ) 
    } 
} 

/imports/ui/App.jsx

import React, { Component, PropTypes } from 'react'; 
import { createContainer } from 'meteor/react-meteor-data'; 

import User from './User'; 

export class App extends Component { 

    renderUsers() { 
     return this.props.users.map((user) => (
      <User key={user._id} user={user} /> 
     )); 
    } 


    render() { 
     return (
      <div> 
       <h1>Users</h1> 

       <table> 
        <tbody> 
         <tr> 
          <td>ID</td> 
          <td>Email</td> 
         </tr> 
         { this.renderUsers() } 
        </tbody> 
       </table> 
      </div> 
     ) 
    } 
} 

App.propTypes = { 
    users: PropTypes.array.isRequired 
} 

export default createContainer(() => { 
    return { 
     users: Meteor.users.find().fetch() 
    } 
}, App); 
+0

おそらく、Userコンポーネントのrenderメソッドは、電子メールが解決される前と、解決された後に2回呼び出されることがあります。ユーザコンポーネントのレンダリングメソッドにconsole.log(this.props)を入れてみてください。 – Swapnil

+0

これまでのところはどうですか? this.props.userのログ値は?ほとんどの場合、電子メール属性がクライアントに送信されていない可能性があります。 – collision

+0

@Swapnil 'console.log'を提案として追加すると' Object {users:Array [0]} 'の後に' Object {users:Array [1]} 'が続きます – Nyxynyx

答えて

2

まあthis.props.user.emailsが未定義であると思われます。これがあなたが探している正しいキーであることを確信していますか?

これを修正する方法。 lodashのようなライブラリで

プル(それはあなたの人生が変わります)

import _ from 'lodash'; 
.... 
<td>{_.get(this.props, 'users.emails[0].address', 'UNKNOWN ADDRESS')}</td> 

あなたがlodashのようなもので引っ張っていけない場合は、値があるかどうかを確認します。..

var address = 'UNKNOWN ADDRESS'; 
if(this.props.users.emails && this.props.users.emails.length > 0) { 
    address = this.props.users.emails[0].address; 
} 
+0

正しいキーです。 'renderUsers()'関数が初めて呼び出されたときには未定義ですが、もう一度呼び出されるときに定義されます。 – Nyxynyx

+0

lodashの '_.get'を使う代わりに、Reactがコレクションを取得したときにのみコンポーネントをレンダリングさせる方法がありますか? – Nyxynyx

+0

@Nyxynyxもし情報がロードされているかどうかに基づいて条件付きレンダリングをしたいのであれば、ユーザーの電子メールがそこにあるかどうかを調べるだけです。もしそうでなければ、アイテムをレンダリングしないでください –

関連する問題