警告:在使用 forwardRef 的 React 中,函数组件无法得到 refs 警告
Warning: Function components cannot be given refs warning in React using forwardRef
我是 React 和 Hooks 的新手。我试图从 react-datepicker into my component, and it comes with a predetermined input element but I wanted to change it with an icon from FontAwesome so I used his custom-input 为它实现一个日期选择器。
这是代码
const Task = () => {
const [startDate, setStartDate] = useState(new Date());
const IconInput = forwardRef(
({ value, onClick }, ref) => (
<FontAwesome icon={faCalendarAlt} className="example-custom-input" onClick={onClick} ref={ref}>
{value}
</FontAwesome>
),
);
return (
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
customInput={<IconInput/>}
/>
);
};
代码正在运行,输入已更改为来自 FontAwesome 的图标,但问题是我在控制台中收到 warning。
这是怎么回事?
我也找到了这个解决方案,但我不知道效果如何。
const Task = () => {
const [startDate, setStartDate] = useState(new Date());
const ref = createRef();
const IconInput = forwardRef(
({ value, onClick }, ref) => (
<FontAwesome icon={faCalendarAlt} className="example-custom-input" onClick={onClick}>
{value}
</FontAwesome>
),
);
return (
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
customInput={<IconInput ref={ref}/>}
/>
);
};
我添加了 ref
变量 returns createRef()
并放入 <IconInput/>
这个 ref={ref}
然后从里面删除 ref
forwardRef()
。这不会给我任何警告...但这是如何工作的?
您应该将从 React.forwardRef
的第二个参数获得的 ref 传递给 FontAwesome
组件。问题是 font awesome 库没有 ref 属性,它有 forwardedRef。
const IconInput = forwardRef(
({ value, onClick }, ref) => (
<FontAwesome icon={faCalendarAlt} className="example-custom-input" onClick={onClick} forwardedRef={ref}>
{value}
</FontAwesome>
),
);
你得到错误的原因是当你将 ref 传递给 class 组件时,它返回了 class 实例,但在功能组件中,它没有任何意义,除非你使用 forwardRef .为了帮助开发人员,React 在这些情况下会在控制台中显示警告(将 ref 传递给不使用 forwardRef 的功能组件)。当您将 ref 传递给 FontAwesome(一个不使用 forwardRef 的功能组件)时,它会向您显示此错误。当您删除 ref 时,它会删除错误,但如果您仔细观察,您从 IconInput 获得的 ref 是空的。
另外,在功能组件中你应该使用 useRef()
而不是 createRef
,像这样:
const ref = useRef();
return (
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
customInput={<IconInput ref={ref}/>}
/>
);
最后一件事 - 您应该将 const IconInput = ...
移动到组件外部,因为现在您在每次渲染时都重新创建组件本身,这会导致问题。
我是 React 和 Hooks 的新手。我试图从 react-datepicker into my component, and it comes with a predetermined input element but I wanted to change it with an icon from FontAwesome so I used his custom-input 为它实现一个日期选择器。
这是代码
const Task = () => {
const [startDate, setStartDate] = useState(new Date());
const IconInput = forwardRef(
({ value, onClick }, ref) => (
<FontAwesome icon={faCalendarAlt} className="example-custom-input" onClick={onClick} ref={ref}>
{value}
</FontAwesome>
),
);
return (
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
customInput={<IconInput/>}
/>
);
};
代码正在运行,输入已更改为来自 FontAwesome 的图标,但问题是我在控制台中收到 warning。
这是怎么回事?
我也找到了这个解决方案,但我不知道效果如何。
const Task = () => {
const [startDate, setStartDate] = useState(new Date());
const ref = createRef();
const IconInput = forwardRef(
({ value, onClick }, ref) => (
<FontAwesome icon={faCalendarAlt} className="example-custom-input" onClick={onClick}>
{value}
</FontAwesome>
),
);
return (
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
customInput={<IconInput ref={ref}/>}
/>
);
};
我添加了 ref
变量 returns createRef()
并放入 <IconInput/>
这个 ref={ref}
然后从里面删除 ref
forwardRef()
。这不会给我任何警告...但这是如何工作的?
您应该将从 React.forwardRef
的第二个参数获得的 ref 传递给 FontAwesome
组件。问题是 font awesome 库没有 ref 属性,它有 forwardedRef。
const IconInput = forwardRef(
({ value, onClick }, ref) => (
<FontAwesome icon={faCalendarAlt} className="example-custom-input" onClick={onClick} forwardedRef={ref}>
{value}
</FontAwesome>
),
);
你得到错误的原因是当你将 ref 传递给 class 组件时,它返回了 class 实例,但在功能组件中,它没有任何意义,除非你使用 forwardRef .为了帮助开发人员,React 在这些情况下会在控制台中显示警告(将 ref 传递给不使用 forwardRef 的功能组件)。当您将 ref 传递给 FontAwesome(一个不使用 forwardRef 的功能组件)时,它会向您显示此错误。当您删除 ref 时,它会删除错误,但如果您仔细观察,您从 IconInput 获得的 ref 是空的。
另外,在功能组件中你应该使用 useRef()
而不是 createRef
,像这样:
const ref = useRef();
return (
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
customInput={<IconInput ref={ref}/>}
/>
);
最后一件事 - 您应该将 const IconInput = ...
移动到组件外部,因为现在您在每次渲染时都重新创建组件本身,这会导致问题。