Я знаю, что ссылки используются для прямого доступа к элементам DOM без изменения состояния. Я читал, что нельзя давать ссылки на функциональные компоненты, потому что они не имеют состояния.
Ссылки не могут быть присоединены к функциональным компонентам. Хотя мы можем определить ссылки и прикрепить их либо к элементам DOM, либо к компонентам класса. Суть в том, что компоненты функций не имеют экземпляров, поэтому вы не можете ссылаться на них.
взято из: https://blog.logrocket.com/cleaning-up-the-dom-with-forwardref-in-react/
Я до сих пор не знаю не понимаю.
Я использую компонент Tooltip
от Ant Design (https://ant.design/components/tooltip/), компонент Button
и пользовательский компонент CircleButton
.
Учитывая следующий JSX:
<Tooltip placement="left" title={"Lock slot"}>
<CircleButton onClick={() => execute(client.close)} icon={<LockOutlined />} disabled={loading} />
</Tooltip>
И мой компонент CircleButton. При таком использовании будет выдано предупреждение .
const CircleButton = (props) => // gives the warning
<Button shape="circle" size="small" style={{ marginRight: "8px" }} {...props} />
Предупреждение. Функциональным компонентам нельзя давать ссылки. Попытки получить доступ к этой ссылке потерпят неудачу. Вы хотели использовать React.forwardRef ()?
Обратите внимание, что все работает, как и ожидалось, несмотря на предупреждение.
Если я отредактирую его следующим образом, он будет работать нормально, почему ?
const CircleButton = forwardRef((props, ref) => // doesn't give the warning
<div ref={ref}>
<Button shape="circle" size="small" style={{ marginRight: "8px" }} {...props} />
</div>)
Имеет ли компонент div
состояние? Я не понимаю forwardRef
выполняет магию c и создает состояние для элемента div?
Почему тогда, если я передаю ref
компоненту Button
, он все равно выдает предупреждение?
const CircleButton = forwardRef((props, ref) => // gives the warning
<Button ref={ref} shape="circle" size="small" style={{ marginRight: "8px" }} {...props} />)
Если я передаю antd
Button
непосредственно как ребенок, это работает. Но это потому, что я полагаю, что кнопка antd имеет состояние, следовательно, она может иметь ссылки.
<Tooltip placement="left" title={"Lock slot"}> // doesn't give the warning
<Button shape="circle" size="small" style={{ marginRight: "8px" }} />
</Tooltip>