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

如何在React中为表单标签生成唯一ID?

颜昕
2023-03-14

我有带有labels的表单元素,我希望有唯一的ID将labels链接到带有htmlFor属性的元素。大概是这样的:

React.createClass({
    render() {
        const id = ???;
        return (
            <label htmlFor={id}>My label</label>
            <input id={id} type="text"/>
        );
    }
});

我以前是根据这个来生成ID的。_rootNodeID,但自从React 0.13之后就不可用了。现在最好和/或最简单的方法是什么?

共有3个答案

轩辕修能
2023-03-14

从2019年4月4日起,这似乎可以通过React Hooks’useState实现:

import React, { useState } from 'react'
import uniqueId from 'lodash/utility/uniqueId'

const Field = props => {
  const [ id ] = useState(uniqueId('myprefix-'))

  return (
    <div>
      <label htmlFor={id}>{props.label}</label>
      <input id={id} type="text"/>
    </div>
  )      
}

export default Field

据我所知,您忽略了数组分解中允许您更新id的第二个数组项,现在您得到了一个在组件生命周期内不会再次更新的值。

id的值将是myprefix-

function gen4() {
  return Math.random().toString(16).slice(-4)
}

function simpleUniqueId(prefix) {
  return (prefix || '').concat([
    gen4(),
    gen4(),
    gen4(),
    gen4(),
    gen4(),
    gen4(),
    gen4(),
    gen4()
  ].join(''))
}

或者看看我在这里发布的库:https://github.com/rpearce/simple-uniqueid.还有数百或数千个其他独特的身份信息,但是有前缀的洛蒂什的uniqueId应该足以完成这项工作。

感谢@Huong Hk为我指出初始状态,其总和是您可以将函数传递到useState,该函数将仅在初始装载时运行。

// before
const [ id ] = useState(uniqueId('myprefix-'))

// after
const [ id ] = useState(() => uniqueId('myprefix-'))

袁高明
2023-03-14

这个解决方案对我来说很好。

utils/newid.js

let lastId = 0;

export default function(prefix='id') {
    lastId++;
    return `${prefix}${lastId}`;
}

我可以这样使用它:

import newId from '../utils/newid';

React.createClass({
    componentWillMount() {
        this.id = newId();
    },
    render() {
        return (
            <label htmlFor={this.id}>My label</label>
            <input id={this.id} type="text"/>
        );
    }
});

但它在同构应用程序中不起作用。

2015年8月17日增补。您可以使用lodash中的uniqueId,而不是自定义newId函数。

2016年1月28日更新。最好在组件willmount中生成ID。

刘阳舒
2023-03-14

id应该放在 组件将安装 (2018年更新)构造函数,而非渲染。将其放入render将不必要地重新生成新ID。

如果使用下划线或lodash,则会有一个uniqueId函数,因此生成的代码应该类似于:

constructor(props) {
    super(props);
    this.id = _.uniqueId("prefix-");
}

render() { 
  const id = this.id;
  return (
    <div>
        <input id={id} type="checkbox" />
        <label htmlFor={id}>label</label>
    </div>
  );
}

2019年更新:

import React, { useState } from 'react';
import _uniqueId from 'lodash/uniqueId';

const MyComponent = (props) => {
  // id will be set once when the component initially renders, but never again
  // (unless you assigned and called the second argument of the tuple)
  const [id] = useState(_uniqueId('prefix-'));
  return (
    <div>
      <input id={id} type="checkbox" />
      <label htmlFor={id}>label</label>
    </div>
  );
}
 类似资料:
  • 问题内容: 我有带有s的表单元素,并且我希望有唯一的ID将s 链接到具有attribute的元素。像这样: 我曾经根据生成ID,但自从React 0.13起就不可用了。现在最好和/或最简单的方法是什么? 问题答案: 这个解决方案对我来说很好。 : 我可以这样使用它: 但它在同构应用程序中不起作用。 添加17.08.2015 。相反,自定义NEWID的功能,您可以使用UNIQUEID从lodash。

  • 问题内容: 我正在使用PHP和MySQL编写脚本,并且想要获得一个唯一的ID(由字符串组成:大写字母和带数字的小写字母),例如:。我在PHP中发现了许多可以生成此类数字的函数,但我担心如何确保id唯一! 更新 :uuid很长,我的意思是这样的ID:(P5Dc)一个11个字母数字的字符。 问题答案: 一个 编程的方式 可以是: 在字段中添加一个唯一索引 在PHP中生成随机字符串 在PHP中循环(wh

  • 我试图找到一种算法,为我正在编写的图表引擎生成Y轴,并且处于拔毛阶段。 四处搜索会产生各种解决方案,但我很难找到一个适合所有数据范围的解决方案。 这是我到目前为止得到的: 这给了我一个新的范围,我想为它生成一个Y轴。 我计算每个YAxis标签之间的距离,如下所示: 我还尝试使用更简单的算法计算滴答声: 前一种方法适用于小范围,例如23- 在0的情况下- 我通过循环labelCount(在我的例子中

  • 关于在CodeIgniter中启用表单验证的规则,我有一个问题。 在另一种解释(链接)中,它们不包括标准用法 我需要使用规则我的字段。 我应该如何使该函数在我的模型文件上工作以启动?因为在文档中,我没有看到关于启用规则的解释。 我目前的代码仍然使用手动匹配数据,但我需要知道如何使用这个规则 美元这个-

  • 问题内容: 如何生成不猜测下一个数字的java中的整数的唯一ID? 问题答案: 它需要有多独特? 如果它仅在流程中唯一,则可以在每次需要新值时使用和调用。

  • 注意:Dreamweaver CC 和更高版本的用户界面已简化。因此,您可能在 Dreamweaver CC 和更高版本中找不到本文中描述的一些选项。有关详细信息,请参阅此文章。 当访问者在 Web 浏览器中显示的 Web 表单中输入信息,然后单击提交按钮时,这些信息将被发送到服务器,服务器中的服务器端脚本或应用程序会对这些信息进行处理。服务器向用户(或客户端)发回所处理的信息或基于该表单内容执行