reactjs - 警告:在 React 中使用 forwardRef 无法给函数组件提供 refs 警告
问题描述
我是 React 和 Hooks 的新手。我试图在我的组件中实现一个来自react-datepicker的日期选择器,它带有一个预定的输入元素,但我想用 FontAwesome 的图标来改变它,所以我使用了他的自定义输入。
这是代码
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 更改了图标的输入,但问题是我在控制台中收到警告。
这是怎么回事?
我也找到了这个解决方案,但我不知道它是如何工作的。
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
返回的变量createRef()
并放入<IconInput/>
this然后从里面ref={ref}
删除。这不会给我任何警告......但是这是如何工作的?ref
forwardRef()
解决方案
您应该将从第二个参数获得的 ref 传递React.forwardRef
给FontAwesome
组件。问题是字体真棒库没有 ref 道具,它有 forwardedRef。
const IconInput = forwardRef(
({ value, onClick }, ref) => (
<FontAwesome icon={faCalendarAlt} className="example-custom-input" onClick={onClick} forwardedRef={ref}>
{value}
</FontAwesome>
),
);
你得到错误的原因是当你将ref传递给一个类组件时,它返回了类实例,但在功能组件中,除非你使用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 = ...
组件之外,因为现在您在每次渲染时都重新创建组件本身,这会导致问题。
推荐阅读
- image - Flutter & Firebase:如何检查我的图片是否成功上传到 Firebase 存储?
- swift - 调用 tableView.deleteRows([indexPath], with: .automatic) 正在删除单元格但没有动画。我究竟做错了什么?
- arrays - 如何在C中将数组的大小加倍
- sql - 使用 row_number sql server 时跳过空值或 0 值
- reactjs - 如何在fullcalendar react v5调度程序中通过json流获取资源?
- javascript - 该函数如何获取没有参数的元素?
- python - Python Pillow diff 操作没有得到正确的结果
- django - Django rest嵌套子序列化器(具有反向关系)列表创建
- python - 保存到用户设备和从用户设备中提取 | 蟒蛇电报机器人
- go - Golang 修复 jpeg 错误的 EOF 格式