Після 2019-04-04, здається, це вдасться досягти за допомогою Реактивних гачків 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-<n>
де <n>
є додаткове ціле значення, повернене з uniqueId
. Якщо це для вас недостатньо унікально, подумайте про те, як зробити своє
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
з префіксом має бути достатньо, щоб виконати роботу.
Оновити 2019-07-10
Завдяки @Huong Hk за те, що він вказав мені на гачки лінивого початкового стану , сума якого полягає в тому, що ви можете передати функцію, useState
яка буде запускатися лише на початковому кріпленні.
// before
const [ id ] = useState(uniqueId('myprefix-'))
// after
const [ id ] = useState(() => uniqueId('myprefix-'))