如何为 JSON 文件中的每个项目呈现一个反应组件?

Posted

技术标签:

【中文标题】如何为 JSON 文件中的每个项目呈现一个反应组件?【英文标题】:how to render a react component for every item in JSON file? 【发布时间】:2020-07-28 23:35:09 【问题描述】:

我想构建锻炼应用程序,所以我创建了一个 JSON 文件,其中包含“exerciseName”和“discription”(我只是在玩 react)

首先我创建了一个名为“ExerciseCard”的组件

  import React from 'react'

function ExerciceCard(props) 

        return(
            <h1>this is the exercie props.exerciceName</h1>
        )



export default ExerciceCard

然后我创建了一个名为 CreateNewWorkout 的页面

import React from 'react'
import ExerciseCard from '../component/ExerciseCard'

class CreateNewWorkout extends React.Component 
    state = 
        exercises : []
    

    async    componentDidMount() 

        let response  = await fetch("http://localhost:1337/calisthenics-exercices")
        const data =  await response.json()
//i wanted to loop throgh the array of and push the exerciceName to the exercise state array
        for (let i = 0; i <data.lenght; i++) 
            this.setState(exercices : [...this.state.exercises, data[i].exeriseName])
        

    
    render() 
        return(
            <>
            <ExerciseCard exerciceName = this.state.exercice ></ExerciseCard>
            </>
        )
    



export default CreateNewWorkout

目前我在 JSON 文件中有两个“练习”,我想知道如何两次渲染 ExerciseCard 组件(在这种情况下)。

【问题讨论】:

【参考方案1】:

通常是这样的

<div>
  dataAsArray.map(val, i) => (
    <div key=i>val</div>
  )
</div>

所以,你需要

<div>
 this.state.exercice.map(ex, i) => (
   <ExerciseCard exerciceName=ex key=i />
 )
</div>

注意:您在组件中的数据流是错误的 - 不适用于生产用途。

【讨论】:

【参考方案2】:

很简单,你不能在一个循环中多次设置状态,而是首先将所有元素推入列表中,然后最后设置状态如下

async    componentDidMount() 
        let response  = await fetch("http://localhost:1337/calisthenics-exercices");
        const data =  await response.json();
const updatedState = [...this.state.exercise]
data.forEach( item => updateState.push(item))
setState(exercises : updatedState);

然后为了渲染这个

    render() 
        return(
            <div>
                this.state.exercise.map(item => <ExerciseCard exerciseName =item />)
            <div/>
        )
    

【讨论】:

它会产生一个警告“数组或迭代器中的每个孩子都应该有一个唯一的“key”道具......”在您的解决方案中添加一个道具“key”以避免

以上是关于如何为 JSON 文件中的每个项目呈现一个反应组件?的主要内容,如果未能解决你的问题,请参考以下文章

反应如何访问 JSON 文件中的对象

如何为数组中的每个项目评估包含 settimeout 的函数(Javascript)

如何为 React Native 中的所有组件设置相同的背景图像?

如何为特定页面创建父组件(以便能够在父级中添加反应上下文)?

如何为数组中的每个对象渲染一个组件?

如何为贝宝上下文快速结帐创建反应组件?