react 遍历生成不同区块下的内容

本文介绍了一种使用异步请求获取数据并安全地更新React组件状态的方法,通过观察者模式和防篡改机制确保了数据的准确性和渲染的及时性。详细解释了如何在点击事件中调用API获取数据,以及如何根据返回的数据动态渲染不同级别的警告信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 存储变量

@observable detail= {};

// 请求接口

@action

async searchD(sysId, obj) {

this.statisticLoading = true;      // loading 以防异步加载渲染时数据还没取到

try {

    const res = await ApiService.searchDtail(obj);

   runInAction(() => {

      if (res && res.size > 0) {

        this.detail[sysId] = res.list;   // 防止点击其他模块时内容被篡改

    }

   this.statisticLoading = false;

});

} catch (error) {

  this.statisticLoading = false;

  console.log(error);

}

}

// 渲染

expandContent = record => {

const { detail} = this.store;

return (

<div>

{detail!== '' && detail[record.sysId] !== undefined    // 根据不同ID渲染

&& detail[record.sysId].length > 0 ?

detail[record.sysId].map((item) => {

return (

<Row key={record.sysId}>

<Col span={4}>{item.createDate}</Col>

{

item.alarmLevel === '1' &&

<Col span={4}>

<div className={cx('icon')} style={{ backgroundColor: '#F5222D' }} />

致命

</Col>

}

{

item.alarmLevel === '2' &&

<Col span={4}>

<div className={cx('icon')} style={{ backgroundColor: '#FAAD14' }} />

严重</Col>

}

{

item.alarmLevel === '3' &&

<Col span={4}>

<div className={cx('icon')} style={{ backgroundColor: '#F8E71C' }} />

一般</Col>

}

<Col span={14}>{item.alarmTitle}</Col>

<Col span={2}>

     ......

</Col>

</Row>

);

})

: ''}

</div>

);

}

<think>好的,我现在需要帮助用户解决在React遍历数组并渲染多个不同按钮的问题。首先,用户提到了使用map方法,这确实是React中常用的方法。根据用户的示例,他们可能希望有一个具体的代码示例,同时还需要注意一些最佳实践,比如添加key属性。 首先,我需要回忆React中列表渲染的基本方法。根据引用[4],使用map函数遍历数组,并为每个元素生成JSX元素,同时给每个元素唯一的key。这样可以帮助React优化渲染性能。此外,引用[2]中提到的条件渲染可能也会有用,比如处理空数组的情况。 然后,用户提到“多个不同按钮”,这可能意味着每个按钮有不同的属性或样式。因此,在示例中应该展示如何根据数组中的数据动态设置按钮的文本或其他属性。例如,数组中的每个元素可能有不同的label和onClick处理函数。 接下来,我需要考虑如何组织代码结构。根据引用[1],在React组件中,可以使用Object.keys和map方法来遍历对象的属性,并将其渲染为列表。不过这里用户处理的是数组,所以直接使用数组的map方法更合适。同时,引用[3]提到使用Fragment来避免多余的DOM节点,不过在这个示例中可能不需要,因为按钮可以直接放在div或其他容器中。 然后,考虑代码示例的结构。首先,定义一个按钮配置的数组,每个配置对象包含id、label和onClick处理函数。然后,在组件中使用map方法遍历这个数组,生成按钮元素。注意每个按钮需要唯一的key,这里可以使用id。同时,处理函数需要绑定正确的参数,避免在渲染时立即执行。 另外,需要处理可能的边缘情况,比如数组为空的情况,可以像引用[2]中的示例那样进行条件渲染,显示一个提示信息。但用户的问题可能更关注基本用法,所以可能不需要复杂条件判断,但为了完整性,可以简要提及。 最后,确保代码符合最佳实践,比如正确使用key,避免使用索引作为key(除非没有其他唯一标识),以及正确绑定事件处理函数。例如,使用箭头函数或在构造函数中绑定,但在示例中使用箭头函数可能更简洁。 总结步骤: 1. 创建按钮配置数组,每个元素包含id、label和onClick。 2. 在组件中使用map方法遍历数组,生成按钮元素。 3. 为每个按钮设置唯一的key。 4. 动态设置按钮的label和onClick处理函数。 5. 处理空数组的情况(可选)。 6. 提供完整示例代码,并解释关键点。 现在,将这些思考整理成一个结构化的回答,确保代码正确,并引用相关的引用资料。</think>在React遍历数组并渲染多个不同按钮,可以通过`map()`方法结合动态属性设置实现。以下是具体实现方法和示例说明: ### 一、实现步骤 1. **准备按钮配置数组**:使用包含不同按钮属性的对象数组 2. **使用`map()`遍历数组**:将数组元素转换为按钮组件 3. **动态绑定事件和样式**:根据数组元素设置不同属性和事件处理 4. **添加唯一`key`属性**:优化React的虚拟DOM更新机制[^4] ### 二、完整示例代码 ```javascript import React from 'react'; function ButtonList({ buttons }) { const handleClick = (action) => { console.log('执行操作:', action); }; return ( <div className="button-group"> {buttons.map((btn) => ( <button key={btn.id} onClick={() => handleClick(btn.action)} style={{ backgroundColor: btn.color }} className={`btn ${btn.size}`} > {btn.label} </button> ))} </div> ); } // 使用示例 const buttonConfigs = [ { id: 1, label: '保存', action: 'save', color: '#4CAF50', size: 'medium' }, { id: 2, label: '删除', action: 'delete', color: '#f44336', size: 'small' }, { id: 3, label: '分享', action: 'share', color: '#2196F3', size: 'large' } ]; function App() { return <ButtonList buttons={buttonConfigs} />; } export default App; ``` ### 三、关键要点说明 1. **动态属性绑定**: - `style`属性根据数组元素的`color`字段设置背景色 - `className`组合固定类名`btn`和动态尺寸类名 - `onClick`事件绑定带参数的箭头函数[^2] 2. **性能优化**: - 必须为每个按钮设置唯一的`key`属性(推荐使用数据ID而非数组索引)[^4] - 复杂场景建议将按钮抽取为独立组件 3. **事件处理技巧**: ```javascript // 使用箭头函数传递参数 onClick={() => handleAction(btn.action)} // 或使用bind预先绑定参数 onClick={handleAction.bind(null, btn.action)} ``` 4. **空数组处理**(可选增强): ```javascript {buttons.length === 0 ? ( <p>暂无可用按钮</p> ) : ( buttons.map(/* ... */) )} ``` 参考条件渲染的最佳实践[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值