起因是接手开发代码的时候发现有个按钮的单击事件一直报错,他是这样写的:
<button>按钮 @click="$refs.table.refresh(true)"</button>
我确认过注册组件是table,明白想要实现的功能是查询后表格刷新。
问题:
$refs是不能在template和computed里面访问的,应该把单击事件绑定一个方法名,在方法中访问$refs。$refs在渲染结束后才会生效,直接写在template中相当于table并没有注册到$refs当中,所以会报Uncaught TypeError: Cannot read property '$refs' of null错误。
官方说明:
关于 ref 注册时间的重要说明:因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在!$refs 也不是响应式的,因此你不应该试图用它在模板中做数据绑定。
可行方法:
//template
<button>按钮 @click="btnRefresh"</button>
//js方法
btnRefresh() {
this.$refs.table.refreshs();
}
其他相关
ref被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件。
$refs是一个对象,里面包含ref注册过的组件,可以访问这个$refs对象方法对组件进行操作。
https://blog.csdn.net/java_xxxx/article/details/81121199
https://blog.csdn.net/LPLIFE/article/details/95220875