Я знаю, что ссылки используются для прямого доступа к элементам 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
творит чудеса и создает состояние для элемента 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>