2017-09-26 3 views
1

オブジェクトを介してのマッピング以降にこのエラーが発生する理由がわかりません。コードは次のとおりです。キャッチされていないエラー:オブジェクトがconstを返すときにリアクションの子として有効でない

const Leki = (props) => { 
     const fakePayload = props.fakePayload; 
     const drugs = props.drugs; 

     const rngPayloadId = Math.floor(Math.random() * 4); 

     const payload = fakePayload.map(payload => { 
      if (payload.payloadId === rngPayloadId) { 

       return payload.drugsId.map(id => { 
        return <tr> 
         {props.dispatch(setId(uuid(), id))} 
        <td>{id}</td> 
        <td>{drugs[id].name}</td> 
        <td><input value={undefined} type="number" name="price" /></td> 
       </tr> 
      }) 
     } 
    }) 
    return(
     <tbody>{payload}</tbody> 
    ) 
} 

この問題を回避するにはどうすればよいですか?

+0

現在の条件は常に満たされているため、無駄です。また、私は欠けていない()、それはこの方法で、それなしで動作します – MazMat

+0

その読みやすい方法。しかし私はあなたの好みを尊重します。問題が '' {{props.dispatch(setId(uid、)、id)} ''にあるかもしれないと思った。 '' 'これがオブジェクトを返すかどうかを調べる。反応の中にオブジェクトを表示したい場合は、それを文字列化します。また、私は条件にそのようなことは "常に満たされた"と同意しない。 –

+0

このフィドルを確認してください。 https://jsfiddle.net/ra3gonro/コンソールと同じエラーが表示されます。 '' '' {info} '' 'を削除すれば、あなたはうまくいくでしょう。 –

答えて

0

array.mapは別の配列を返します。 payload.payloadId === rngPayloadIdの場合にのみ結果を返すので、​​のエントリの一部はnullです。

代わりにfakePayload.filterを使用してください。

私はあなたがそれをチェックアウトできるように例を挙げました。

const Leki = ({ fakePayload = [], drugs = [] }) => { 
 
    const rngPayloadId = Math.floor(Math.random() * 4) 
 
    
 
    const payload = fakePayload 
 
    .filter(payload => payload.payloadId === rngPayloadId) 
 
    .map(payload => 
 
     payload.drugsId.map(id => 
 
     <tr key={id}> 
 
      <td>Id: {id}</td> 
 
      <td>{drugs[id].name}</td> 
 
     </tr> 
 
    ) 
 
    ) 
 
    
 
    return <tbody>{payload}</tbody> 
 
} 
 

 
const fakePayload = [{ 
 
    payloadId: 0, 
 
    drugsId: [1, 2], 
 
}, { 
 
    payloadId: 1, 
 
    drugsId: [3, 4], 
 
}, { 
 
    payloadId: 2, 
 
    drugsId: [5, 6], 
 
}, { 
 
    payloadId: 3, 
 
    drugsId: [7, 8], 
 
}] 
 
    
 
const drugs = { 
 
    1: { name: 'Drug 1' }, 
 
    2: { name: 'Drug 2' }, 
 
    3: { name: 'Drug 3' }, 
 
    4: { name: 'Drug 4' }, 
 
    5: { name: 'Drug 5' }, 
 
    6: { name: 'Drug 6' }, 
 
    7: { name: 'Drug 7' }, 
 
    8: { name: 'Drug 8' }, 
 
} 
 
    
 
class App extends React.Component { 
 
    render() { 
 
    return (
 
     <table> 
 
     <Leki fakePayload={fakePayload} drugs={drugs} /> 
 
     </table> 
 
    ) 
 
    } 
 
} 
 

 
ReactDOM.render(
 
    <App />, 
 
    document.getElementById('root') 
 
)
table tr td { 
 
    border: 1px solid red; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id="root"></div>

+0

少し違う言葉で同じエラーを返してください。コンポーネントを別にビルドしたときにマップしていましたが、うまくいきましたが、render()でディスパッチ・プロップを行うことができませんでしたので、コンポーネントを現在のフォームに再構築しましたが、今度は小道具をディスパッチしながら描画します。 – MazMat

+0

それが動作しても、最後のペイロードは配列の配列です(あなたは 'payload.drugsId'を使ってマッピングしています)。レンダリングする前にこの配列を平坦化しなければならないと思いませんか? – mersocarlin

0

{}see this)内のオブジェクトや配列をレンダリングする方法を知りません反応します。 payload.drugsIdをマッピングするときには、それぞれidがオブジェクトになります。このように参照すると、<td>{id}</td>は失敗します。たとえば、{id[0]}を使用するか、<td>{JSON.stringify(id)}<td>を使用して、各繰り返しでマップの結果を確認し、必要に応じてコードを変更することができます。

+0

まあ、Reactはそれらをレンダリングする方法を知っているようですが、コードを少し変更しても配列は問題なくレンダリングされますが、ディスパッチ・プロップはできません。 「{props.dispatch(setId(uid()、id)}}」を削除すると「すべて正常に動作します。私が明らかにレンダリングの内部に状態を設定しようとするので、私は "{props.dispatch(setId(uid、)、id})"を "payload.drugsId.map(id => {"プログラムループとクラッシュ) – MazMat

関連する問題