当前位置: 首页 > 知识库问答 >
问题:

如何给不变的唯一键列表项目反应?

金和雅
2023-03-14

我试图使一个输入组件,突出了新改变的字符。为了实现这一点,我让输入元素透明,并在它下面创建了一个具有相同字体大小的div绝对位置。在这个div里面,我用输入字符串的每个字符渲染了一个span的列表。为了跨度,我应用了一个3s动画来将它的颜色从红色(高亮显示)更改为黑色(正常)。
现在要使列表正确运行,我需要通过每个列表项的键,用于唯一标识每个列表项,以便仅突出显示最近输入的字符,其余字符保持不变。

我所尝试的

>

  • 使用索引作为键
    只要我在最后插入文本,就可以正常工作,但当在两个元素之间插入任何文本时,所有以下元素的索引都会发生更改,因此它们都会更新并突出显示

    使用字符作为键
    由于我们只有26个字符,只要任何字符重复一次,a就会为两个不同的列表项使用相同的键,而且它的行为也很奇怪

    使用字符和上下文作为键(即,charr[index 1]arr[index-1]等)
    但在涉及类似模式时,如“aaaaa”等。。它的行为出乎意料。

    使用随机数/id生成器(uuid等)/新日期()。getTime()
    但只要元素更新,就会调用渲染函数,并且所有列表项都会收到全新的键,所以它们都会更新

    在父组件中使用计数器来计算输入字段中的更改总数,并将该数字指定为新添加的字符组件的键。
    我不知道如何实现,因为为此我需要检查一些东西,比如元素没有键,分配新的数字,否则保留旧的数字。

    有没有办法给每个列表项的新键(唯一的)基于它是什么时候创建的,这样我就可以只突出显示更改的元素?

    class Input extends Component {
      render() {
        let elems = null;
        let str = Array.from(this.props.value);
        elems = str.map((ch, i, arr) => (
          <span key={ch + arr[i - 1]} className="ch"> // .ch has animation to change color from red to black
            {ch}
          </span>
        ));
        return (
          <div className="fancyText">
            <input
              type={this.props.type}
              value={this.props.value}
              placeholder={this.props.placeholder}
              onChange={this.props.onChange} 
            /> // this one is transparent
            <div className="highlighted"> // this is visible
                {elems}
            </div>
          </div>
        );
      }
    }
    

    这里是沙盒链接*


  • 共有1个答案

    孔鹤龄
    2023-03-14

    为了完成您所需要的,您可以使用一个名为uuid的简单npm包。在类组件中,首先导入它。

    import { v4 as uuidv4 } from 'uuid';
    

    然后,您必须为要重用的组件的第一个父标记分配唯一id。

    <span key={uuidv4()} className="ch">
        {ch}
      </span>
    

    如果你有一个自定义密钥,那么你可以像这样用uuid,

     <span key={uuidv4(YOUR_CUSTOM_KEY)} className="ch">
        {ch}
      </span>
    

    希望这对你有帮助。

     类似资料:
    • 我有一个问题,“列表中的每个孩子都应该在我的应用程序中有一个唯一的“键”道具”错误。我可以打印表格,但我不知道为什么它给我这个错误,因为我提供了一个唯一的ID列表中的每个项目。 我也尝试过向我的表头添加一个键属性,但这并不能修复错误。 如有任何意见,将不胜感激 客户组件 表组件

    • 我一直在调试这个,开始掉头发。到目前为止,我还没有找到解决办法。这是组件。我最初是为组件编写测试的,但是由于样式化的组件,它出现了一些错误,所以我的技术负责人告诉我为这个新的组件(这是组件中的新组件)编写测试,因为它可能有一些效果。运行<代码>摘要时。测验tsx我收到此错误(与钥匙相关): 我的挑逗测试: 我的戏弄组件:

    • 问题内容: 我有一个看起来像这样的列表列表: 删除重复列表的最佳方法是什么?使用上面的示例,我正在寻找会产生这种情况的代码: 我最初以为我可以使用,但这似乎不适用于列表列表。我还看到了一个使用的示例,但是代码对我来说并不完全清楚。谢谢您的帮助! 问题答案: uniq_animal_groups = set(map(tuple, animal_groups)) 尽管您将得到一组元组而不是一组列表,但

    • 我有一个dynamodb表,用于存储在我的服务器上运行的进程的历史运行数据,我需要一个可以聚合这些进程并查看每个进程的最新数据的位置。每个进程都有自己的ProcessId,它是dynamodb表的分区键。排序键是开始时间 本质上,我需要为我提供的每个ProcessId检索最新的StartDateTime。我在aws sdk中使用nodejs lambda来检索数据。我已经研究过使用BatchGet

    • 问题内容: 我很好奇将这种数据对象唯一化的有效方法: 对于每个数据对,左边的数字字符串加上右边的类型说明了数据元素的唯一性。返回值应为与testdata相同的列表列表,但仅保留唯一值。 问题答案: 您可以使用一组: 您还可以看到此页面,该页面对各种保留或不保留顺序的方法进行了基准测试。

    • 问题内容: 我有两个字符串,我想在它们的交点 包括 重复项: 我希望它返回: 有任何想法吗? 问题答案: 多集在python 2.7或更高版本中作为(可变)对象实现。您可以对集合执行许多相同的操作,例如联合,相交,差(尽管计数可能变为负数)等: 解: 更多细节: 您可以使用想要的字符串还是列表,尽管我只是将其保留为可迭代的格式。