使用react遍历对象生成dom

 更新时间:2023年01月17日 08:59:14   作者:apple_2021  
这篇文章主要介绍了使用react遍历对象生成dom问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

react遍历对象生成dom

项目场景

目前有一个需求,是要接收后台返回的一个对象,并且遍历他的属性和值显示到页面上,因为该对象表示的是自定义参数,每一次都不一样,所以记录一下;

问题描述

之前最常用的map是方法是用来遍历数组的。

const arr = [a, b, c]
render(){
  return (
	<div>
	{
		arr.map((item,index)=>{
			return (
			  <div key={index}>{item}</div>
			)
		 })
	}
	</div>
  )
}

那对象的话,怎么遍历呢?

API: Object.keys()

作用:遍历对象中的属性

所以我们可以通过Object.keys(obj)来获取该对象的所有属性,根据这个数组的map方法生成相应的dom节点,代码如下:

const obj = {
	a: [1,2,3],
	b: [4,5,6]
}

Object.keys(obj).map((element,index)=>{
	return (
		<div key={index}>
			<div>{element}</div>
			element.map((item,i)=>{
				return (
					<div key={i}>{item}</div>
				)
			})
		</div>
	)
})

不要着急,继续往下看,还可能遇到个小坑

补充

看下面的代码,看看你能否发现问题

 // field为接口字段,属性个数不确定。
 // 例如: field = { a: "123", model: "text", ... } 
 <Descriptions 
 	title="自定义参数" 
 	size="middle" 
 	labelStyle={{ color:"#999" }} 
 	style={{ overflowY: "auto", maxHight: "160px" }}
 >
	{/* <pre >{JSON.stringify(field,null,2)}</pre> */}
	{
	  Object.keys(field).map((name)=>{
	    return <Descriptions.Item label={name}>{field.name}</Descriptions.Item>
	  })
	}
	</Descriptions>

这段代码在页面展示的时候,只展示属性,那么为什么不展示值呢,这个就得从对象的点和中括号的区别说起了。

下面选自《你不知道的JavaScript(上卷)》

简单的说就是:

  • 中括号法可以用变量作为属性名,而点方法不可以;
  • 中括号法可以用数字作为属性名,而点语法不可以;
  • 中括号法可以使用js的关键字和保留字作为属性名,而点语法不可以 (尽量避免在变量或者属性中使用关键字或保留字);

react中操作dom

当我们在react中需要做一些dom操作时,就会使用到react给我们预留的“后门”。

之所以称之为“后门”,是因为当前流行框架react/vue出现的目的就是避免操作dom,造成渲染浪费。然而很多时候不能不操作dom。

1、通过React.createRef()/useRef();来创建一个ref变量。

// 类组件中
constructor (props) {
    super(props);
    this.myRef = React.createRef();
}
// 函数组件中(使用hooks)
const myRef = useRef();

2、在对应的dom节点上写入ref。

// 类组件
<div className="t-box scroll-bar" ref={this.myRef}>
    ...
</div>

// 函数组件
<div className="t-box scroll-bar" ref={myRef}>
    ...
</div>

3、使用react-dom中的findDomNode()得到具体的dom。

import ReactDom from 'react-dom';
// 类组件
const getTargetDOM = ReactDom.findDOMNode(this.myRef.current);
// 函数组件
const getTargetDOM = ReactDom.findDOMNode(myRef.current);

4、根据获取的dom进行一些dom操作即可。例如操作js盒模型、设置文字样式等等。

// 设置向上滚动距离
getTargetDOM.scrollTop = 1000;
getTargetDOM.style.color = 'red';

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • React router动态加载组件之适配器模式的应用详解

    React router动态加载组件之适配器模式的应用详解

    这篇文章主要介绍了React router动态加载组件之适配器模式的应用 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • React函数组件hook原理及构建hook链表算法详情

    React函数组件hook原理及构建hook链表算法详情

    这篇文章主要介绍了React函数组件hook原理及构建hook链表算法详情,每一个 hook 函数都有对应的 hook 对象保存状态信息,更多详细分析,需要的朋友可以参考一下
    2022-07-07
  • React实现父组件调用子组件的两种写法

    React实现父组件调用子组件的两种写法

    react通信分很多种,比如:父子通信,兄弟通信等等,这里我们就简单说一下父子通信,父子通信分为:父组件调用子组件里面的方法;子组件调用子组件里面的方法,这里我们着重说一下父组件调用子组件,需要的朋友可以参考下
    2024-04-04
  • react+zarm实现底部导航栏的示例代码

    react+zarm实现底部导航栏的示例代码

    本文主要介绍了react + zarm 实现底部导航栏的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • react router4+redux实现路由权限控制的方法

    react router4+redux实现路由权限控制的方法

    本篇文章主要介绍了react router4+redux实现路由权限控制的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 详解React中的不可变值

    详解React中的不可变值

    这篇文章主要介绍了React中的不可变值的相关资料,帮助大家更好的理解和学习使用react.js,感兴趣的朋友可以了解下
    2021-04-04
  • React使用Context的一些优化建议

    React使用Context的一些优化建议

    Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法,本文为大家整理了React使用Context的一些优化建议,希望对大家有所帮助
    2024-04-04
  • react lazyLoad加载使用详解

    react lazyLoad加载使用详解

    lazy是React提供的懒(动态)加载组件的方法,React.lazy(),路由组件代码会被分开打包,能减少打包体积、延迟加载首屏不需要渲染的组件,依赖内置组件Suspense标签的fallback属性,给lazy加上loading指示器组件,Suspense目前只和lazy配合实现组件等待加载指示器的功能
    2023-03-03
  • React Fiber原理深入分析

    React Fiber原理深入分析

    Fiber可以理解为一个执行单元,每次执行完一个执行单元,React Fiber就会检查还剩多少时间,如果没有时间则将控制权让出去,然后由浏览器执行渲染操作,这篇文章主要介绍了React Fiber架构原理剖析,需要的朋友可以参考下<BR>
    2023-01-01
  • React Native提供自动完成的下拉菜单的方法示例

    React Native提供自动完成的下拉菜单的方法示例

    这篇文章主要为大家介绍了React Native提供自动完成的下拉菜单的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论