<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>key的作用</title>
</head>
<body>
<div id="test"></div>
<!-- 引入react核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- 引入react-dom -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!-- 引入babel -->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
/*
经典面试题:
1). react/vue中的key有什么作用?(key的内部原理是什么?)
2). 为什么遍历列表时,key最好不要用index?
1. 虚拟DOM中key的作用:
1). 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。
2). 详细的说: 当状态中的数据发生变化时,react会根据【新数据】生成【新的虚拟DOM】,
随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较,比较规则如下:
a. 旧虚拟DOM中找到了与新虚拟DOM相同的key:
(1).若虚拟DOM中内容没变, 直接使用之前的真实DOM
(2).若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM
b. 旧虚拟DOM中未找到与新虚拟DOM相同的key
根据数据创建新的真实DOM,随后渲染到到页面
2. 用index作为key可能会引发的问题:
1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。
2. 如果结构中还包含输入类的DOM:
会产生错误DOM更新 ==> 界面有问题。
3. 注意!如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,
仅用于渲染列表用于展示,使用index作为key是没有问题的。
3. 开发中如何选择key?:
1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
2.如果确定只是简单的展示数据,用index也是可以的。
*/
/*
慢动作回放----使用index索引值作为key
初始数据:
{id:1,name:'小张',age:18},
{id:2,name:'小李',age:19},
初始的虚拟DOM:
<li key=0>小张---18<input type="text"/></li>
<li key=1>小李---19<input type="text"/></li>
更新后的数据:
{id:3,name:'小王',age:20},
{id:1,name:'小张',age:18},
{id:2,name:'小李',age:19},
更新数据后的虚拟DOM:
<li key=0>小王---20<input type="text"/></li>
<li key=1>小张---18<input type="text"/></li>
<li key=2>小李---19<input type="text"/></li>
-----------------------------------------------------------------
慢动作回放----使用id唯一标识作为key
初始数据:
{id:1,name:'小张',age:18},
{id:2,name:'小李',age:19},
初始的虚拟DOM:
<li key=1>小张---18<input type="text"/></li>
<li key=2>小李---19<input type="text"/></li>
更新后的数据:
{id:3,name:'小王',age:20},
{id:1,name:'小张',age:18},
{id:2,name:'小李',age:19},
更新数据后的虚拟DOM:
<li key=3>小王---20<input type="text"/></li>
<li key=1>小张---18<input type="text"/></li>
<li key=2>小李---19<input type="text"/></li>
*/
class Person extends React.Component{
state = {
persons:[
{id:1,name:'小张',age:18},
{id:2,name:'小李',age:19},
]
}
add = ()=>{
const {persons} = this.state
const p = {id:persons.length+1,name:'小王',age:20}
this.setState({persons:[p,...persons]})
}
render(){
return (
<div>
<h2>展示人员信息</h2>
<button onClick={this.add}>添加一个小王</button>
<h3>使用index(索引值)作为key</h3>
<ul>
{
this.state.persons.map((personObj,index)=>{
return <li key={index}>{personObj.name}---{personObj.age}<input type="text"/></li>
})
}
</ul>
<hr/>
<hr/>
<h3>使用id(数据的唯一标识)作为key</h3>
<ul>
{
this.state.persons.map((personObj)=>{
return <li key={personObj.id}>{personObj.name}---{personObj.age}<input type="text"/></li>
})
}
</ul>
</div>
)
}
}
ReactDOM.render(<Person/>,document.getElementById('test'))
</script>
</body>
</html>
没有合适的资源?快使用搜索试试~ 我知道了~
react学习入门_react入门_react前端学习
共48个文件
html:36个
js:8个
png:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 30 浏览量
2022-09-20
13:21:49
上传
评论
收藏 894KB RAR 举报
温馨提示
适合react入门学习,通俗易懂,注解丰富,便于理解
资源详情
资源评论
资源推荐
收起资源包目录
react学习入门.rar (48个子文件)
react_basic
10_react中收集表单数据
2_受控组件.html 2KB
1_非受控组件.html 1KB
11_高阶函数_函数柯里化
1_高阶函数_函数柯里化.html 2KB
2_不用函数柯里化的实现.html 2KB
06_组件实例三大属性1_state
1_state.html 2KB
2_state的简写方式.html 1KB
07_组件实例三大属性2_props
3_props的简写方式.html 2KB
4_函数组件使用props.html 1KB
2_对props进行限制.html 2KB
1_props基本使用.html 1KB
13_DOM的Diffing算法
1_验证Diffing算法.html 1KB
2_key的作用.html 5KB
05_react中定义组件
1_函数式组件.html 1KB
2_类式组件.html 1KB
02_虚拟DOM的两种创建方式
1_使用jsx创建虚拟DOM.html 896B
2_使用js创建虚拟DOM.html 715B
3_虚拟DOM与真实DOM.html 1KB
08_组件实例三大属性3_refs
1_字符串形式的ref.html 1KB
2_回调函数形式的ref.html 1KB
4_createRef的使用.html 1KB
3_回调ref中回调执行次数的问题.html 2KB
复习
5_对象相关的知识.html 274B
1_类的基本知识.html 2KB
6_演示函数的柯里化.html 391B
2_原生事件绑定.html 608B
4_展开运算符.html 894B
3_类方法中的this指向.html 602B
12_组件的生命周期
3_react生命周期(新).html 3KB
workspace.code-workspace 133B
4_getSnapshotBeforeUpdate的使用场景.html 2KB
2_react生命周期(旧).html 4KB
2_react生命周期(旧).png 43KB
3_react生命周期(新).png 65KB
1_引出生命周期.html 2KB
js
babel.min.js 773KB
prop-types.js 47KB
17.0.1
babel.min.js 773KB
prop-types.js 47KB
react-dom.development.js 918KB
react.development.js 108KB
react-dom.development.js 771KB
react.development.js 100KB
01_hello_react
hello_react.html 834B
09_react中的事件处理
事件处理.html 2KB
03_jsx语法规则
jsx语法规则.html 2KB
favicon.ico 1KB
04_jsx的小练习
Untitled-1.html 990B
jsx小练习.html 1KB
共 48 条
- 1
Kinonoyomeo
- 粉丝: 74
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0