首页 > 其他分享 >react的函数式组件中使用ref获取到子组件的方法为undefined

react的函数式组件中使用ref获取到子组件的方法为undefined

时间:2023-06-27 10:55:49浏览次数:41  
标签:到子 const useImperativeHandle react 组件 返回值 foo ref

我暂时遇到了两种情况。

第一种情况:useImperativeHandle函数写错

useImperativeHandle的第二个参数的返回值是作为ref.current的值,但是我写箭头函数写快了,忘记返回值了。


useImperativeHandle(ref, () => {foo}, [foo]) // 错误,这样没有返回值,所以ref.current为undefined

useImperativeHandle(ref, () => ({foo}), [foo]) // 正确,返回值为{foo}

第二种情况:组件一开始并未渲染(例如弹框)

这种情况我找了许久, 当一开始子组件还没用展示的时候,在触发某种条件才出现,这个时候绑定不到子组件,也就无法将子组件中的方法绑定到ref上面。


const Father = forward((props = {}, ref) => {
  const childrenRef = useRef()
  const [flag, setFlag] = useSafeState(false)
  const testChildren = useMemoizedFn(() => {
    childrenRef.current?.onHellow()
  })

  return (<>
    <Button onClick={() => setFlag(!flag)}>更换</Button>
    <Button onClick={testChildren}>测试孩子方法</Button>
    {flag?<Children ref={childrenRef} />:undefiend}
  </>)

})

const Children = forward((props = {}, ref) => {
  const onHellow = useMemoizedFn(() => {
    console.log('hellow world!')
  })
  
  return (<>
    我是孩子组件
  </>)
})

标签:到子,const,useImperativeHandle,react,组件,返回值,foo,ref
From: https://www.cnblogs.com/taosifan/p/17508088.html

相关文章

  • Vue如何在页面加载时将url的参数赋值给组件
    <template> <inputv-model="loginForm.username" name="username" type="text" tabindex="1" auto-complete="on" /><inputv-model="loginForm.password":type="passwordType"......
  • 前端Vue自定义加载中loading加载结束end组件 可用于分页展示 页面加载请求
    前端Vue自定义加载中loading加载结束end组件可用于分页展示页面加载请求,请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13219效果图如下:实现代码如下:cc-paging使用方法<!--加载中用法isLoading:是否加载isEnd:是否结束加载--><cc-paging:isLoad......
  • 【Vue3】Vue3中常用的组件传参方式
    props/$emit父传子(自定义属性props)//父组件代码<Son:name="test"/>//子组件代码<div>{{name}}</div>props:{name:{type:String,default:"default",},}子传父(自定义this.$emit)//子组件代码<button@click=&qu......
  • HTML Over the wire 框架 Unpoly 和 React 的使用场合比较
    Unpoly是一个轻量级的JavaScript框架,它允许您通过HTMLoverthewire的方式进行Web应用程序开发。HTMLoverthewire是一种网络通信模式,它将由服务器生成的HTML片段作为响应发送给客户端,而不是传统的JSON数据。这样,服务器端可以处理更多逻辑,而客户端可以专注于渲染和......
  • 6月26日java&React学习日记
    今日学习java的异常处理,了解了多try,catch,以及单try多catch(需注意子类在上父类在下)异常捕获的方法。同时也学习了React框架,该框架确实比较好用但上手难度较高,需理解其组件化原理,改框架涉及ES6比较深,需加强js或ts的学习。 ......
  • 【Vue】Vue3+Vite 实现 SVG 组件自动加载 icons 目录下所有文件
    1.安装依赖插件vite-plugin-svg-iconsvite-plugin-svg-icons用于生成svg雪碧图。特点:1.预加载在项目运行时就生成所有图标,只需操作一次dom2.高性能内置缓存,仅当文件被修改时才会重新生成vite-plugin-svg-icons官方文档pnpmaddvite-plugin-svg-icons2.安装......
  • 【TypeScript】Element 组件导入在 TypeScript 5 报错:模块 ““element-plus““ 没有
    报错现象解决方法typescript5.0版本升级,使用了compilerOptions.moduleResolution:"bundler"的模块编译选项。moduleResolution:模块解析策略,是指编译器在查找导入模块内容时所遵循的流程因此目前要解决报错,我们只需要修改tsconfig.json下的为node就行。/*Bundle......
  • form组件
    form组件在我们日常填写注册信息或者报名信息时,所访问的网页,在输入信息有错误时就显示一些后端传入的提示。我们当然可以通过ajax绑定事件来从后端取一些提示,但是表单是个整体,如果每个输入框都需要我们完整的写一轮这么一套逻辑,这就太麻烦了,所以针对表单标签,django提供了form组......
  • 【HarmonyOS】低代码项目中设置拖拽组件背景色透明度问题
    【关键字】HarmonyOS、低代码开发、拖拽组件、背景色透明度【问题描述】使用拖拽式组件开发HarmonyOS项目时,想给组件设置背景色透明度,有如下几个问题:1)使用DevEcoStudio自带的颜色选择器,无法设置透明度,只能手动输入2)在子模块library中给组件手动输入#ff000000格式背景色,在主模块ent......
  • Vite 组件化开发
    什么是Vite?Vite是一个基于ES模块的构建工具,旨在提供快速、轻量级的开发体验。与传统的打包工具不同,Vite利用浏览器原生支持的模块加载能力,实现了更快的冷启动和热模块替换。它支持Vue.js、React和其他前端框架,并且具有开发服务器和优化的构建配置,可以大大提升前端项目的开......