美文网首页
React 之key的使用

React 之key的使用

作者: 那颗星_fcaf | 来源:发表于2018-06-14 16:49 被阅读18次

key

我遇见的问题

在写项目的时候,项目中需要用到音频播放器,但是原始的 audio 标签在不同的浏览器,会有不同的样式,所以就自己写了一个简单的播放器,用于满足项目中播放音频的功能。
但是在使用的过程中,发现了两个问题:

  • 音频出错的时候怎么提示用户;
  • 在新的音频出现之后,音频组件的状态并没有重置。如下图所示:
    屏幕快照 2018-06-14 下午3.45.43.png
    屏幕快照 2018-06-14 下午3.45.11.png
    第一张图片是查询条件改变后,audio 组件应有的状态和样式,现实确实图二的样子。

解决第一个问题

面对这个问题,我开始的时候是在组件中,给 audio 添加监听 error 事件,因为音频比较多,这样在数据查询条件改变的时候,就要频繁的操作真的DOM,性能比较差,后来发现其实可以在音频播放的时候 catch 错误,提示用户。

const playPromise = audio.play();
        if (playPromise) {
          playPromise.then(() => {}).catch(() => {
            message.error('音频出错了');
          });
        }

解决第二个问题

面对这个问题,想到的就是这个组件并没有卸载重新渲染,而是改变了数据,导致的。
我们知道了问题所在,这样解决起来应该就好很多了。
嗯,我们用 Reactkey 属性来解决这个问题。
那就先来说一下 key 的作用吧:

key 的作用:

react 中的 key 属性,它是一个特殊的属性,它是出现不是给开发者用的,而是给 react 自己用的。
react 利用 key 来识别组件,它是一种身份标识。每个 key 对应一个组件,相同的 keyreact 认为是同一个组件,这样后续相同 key 对应的组件都不会被创建,而是会被传入新的数据,更新组件。
有了 key 属性后,就可以与组件建立了一种对应关系,react 根据 key 来决定是销毁重新创建组件还是更新组件。

  • key 相同,若组件属性有所变化,则 react 只更新组件对应的属性;没有变化则不更新。
  • key 值不同,则 react 先销毁该组件( 有状态组件的componentWillUnmount会执行 ),然后重新创建该组件( 有状态组件的constructor和componentWillUnmount都会执行 )。
key 的使用场景
  • 在项目开发中,key 属性的使用场景最多的还是由数组动态创建的子组件的情况,需要为每个子组件添加唯一的 key 属性值(最好不要用数字的 index 属性 )。那么,为何由数组动态创建的组件必须要用到 key 属性呢?这跟数组元素的动态性有关。
    非数组动态创建的自组件,为什么不需要 key 呢?因为非数组动态创建的自组件,不管 stateprops 怎么变化,其所在的位置都不会发生变化,这是它天然的 key 。而由数组创建的组件可能由于动态的操作导致重新渲染时,子组件的位置发生了变化。
    可以看出,数组创建子组件的位置并不固定,动态改变的;这样有了 key 属性后,react 就可以根据 key 值来判断是否为同一组件。
  • 为一个有复杂繁琐逻辑的组件添加 key 后,后续操作可以改变该组件的 key 属性值,从而达到先销毁之前的组件,再重新创建该组件。
key 其他的注意事项

当然除了为数据元素生成的组件要添加 key ,且 key 要稳定且唯一之外,还需要注意以下几点:

  • key 属性是添加到自定义的子组件上,而不是子组件内部的顶层的组件上。
  • key 值的唯一是有范围的,即在数组生成的同级同类型的组件上要保持唯一,而不是所有组件的 key 都要保持唯一。
  • 不仅仅在数组生成组件上,其他地方也可以使用 key ,主要是react利用 key 来区分组件的,相同的 key 表示同一个组件,react 不会重新销毁创建组件实例,只可能更新; key 不同,react 会销毁已有的组件实例,重新创建组件新的实例。

解决问题,给组件添加 key 属性,如下:

<AudioPlay key={item.requestId} item={item} src={src} type="ASR" idNum={item.id} id={`ASRplay${item.id}`} />

相关文章

  • React 之key的使用

    key 我遇见的问题 在写项目的时候,项目中需要用到音频播放器,但是原始的 audio 标签在不同的浏览器,会有不...

  • react navigation返回到任意页面(不集成redux

    react navigation默认是使用key作为goback的参数进行返回的,这个key是一个动态生成的,而不...

  • react进阶-节点比较

    1.key增加性能,需要注意: 2.关于key的使用 3.diff算法 react-diff算法就是上面说的启发式...

  • react-native-baidu-map使用及注意问题

    使用组件: react-native-baidu-map 获取百度地图API_KEY 地址:http://lbsy...

  • React 篇之浅谈 setState is异步OR同步

    React 篇之浅谈 setState is异步OR同步   react 篇主要是记录笔者之前在使用 React ...

  • Windows下打包安卓apk

    Windows下 React Native安卓项目打包APK 使用Android study生成一个key文件 b...

  • React的key

    react中的key的选择父元素下面的子节点之间需要设置一个唯一的key值,方便diff算法计算。Key 应该具有...

  • React(Key)

    key适用于Virtual DOM树新旧情形如下时 旧 新 我们只是前插了一个TodoItem 节点,但如果没有k...

  • react key

    为什么不能拿数组的index作为react的key 因为对于动态列表,如果索引对应的值发生了变化,尤其是排在前面的...

  • key和数组方法

    key vue官网推荐我们使用v-for时,给每一个节点元素添加一个唯一的 key,其实不只是vue,react中...

网友评论

      本文标题:React 之key的使用

      本文链接:https://www.haomeiwen.com/subject/unyyeftx.html