碰到一个需求,在
<el-input ref="promptInput" type="textarea">
中,使用
this.$nextTick(() => {
this.$ref.promptInput.focus();
});
出现了报错。
具体报错为
this.$refs.promptInput.focus is not a function
打印一下this.$refs.promptInput发现有值,但是找不到focus方法
问题在于直接给el-input绑定一个ref取到的是textarea外面的那层div
并没有真正的拿到textarea
分析一下 this.$refs.promptInput 的打印值,外面的那层div只有change,input,blur方法,focus是直接绑在textarea上面的
实测正确的写法为:
this.$nextTick(() => {
this.$refs?.promptInput?.$children[0]?.$refs?.textarea?.focus();
});
或者更简单一点:
this.$nextTick(() => {
this.$refs?.promptInput?.$children[0]?.focus();
});
另一种写法,直接用querySelector,不用ref
this.$nextTick(() => {
document.querySelector('textarea').focus();
});
如果有多个
this.$nextTick(() => {
document.querySelectorAll('textarea')[1].focus();
});
document.getElementsByName(…).focus is not a function 依据input的name属性获取焦点
这个问题原因很简单,在控制台输出就明白了。
console.log(document.getElementsByName(‘name’));
输出结果是list,因此,要获取到节点,需要加数组下标。
正确的写法是这样
document.getEleme...
二、如果父组件引用的是index页面 请在 头部加上以下代码 (如果是form页面请忽略这一步)三、引用index页面的最后一定要加上这个两个 (form页面忽略此步骤,只看第一步)中以下四步都没问题的话,再看下面步骤。open 是作为弹出层必备。抛出意味着其他页面可以引用。
实际上,在我测试的一个列表的的应用里(列表每个元素有一个编辑框),这个$el也是个undefined,仍然不行。也就是从$refs里面拿出来这个组件后,它的第0个元素,才是input的真身。如果你试了上面的方法都不行的时候,别气馁,下面的方法也许能让你出坑。如果要实现页面加载后,立即让编辑框获得焦点并进入编辑状态,请移步。通常,你搜到的很多答案都说通过。你可能会遇到这个脚本错误的信息。
因为自己的项目中,某些常用模块自己定义了组件,使用时 常出现TypeError: this.$refs.xxx is not a function (即没有xxx这个方法),结合网友和自身遇到的问题,得出三种方法
v-focus在文件夹src/utils下新建文件夹directives存放聚焦的js文件// 确保元素挂载,数据被解析后,el.focus();});组件模板中组件脚本代码中// 若使用的是vue3的setup语法糖需要分出来写
证明this.$refs[ref] 取到了值,只不过值身上没有execSqlData的方法,才会报 execSqlData is not a function.可以确定的是,子组件上是有execSqlData的方法,那么为什么还会报is not a function呢?当 ref 和 v-for 一起使用的时候,用this.$refs[xxx][0] 获取子组件身上的值。背景:使用v-for循环动态绑定ref,取值报错。分析:如果是动态的ref值取错了,那么会报。