相关文章推荐
大方的稀饭  ·  Element ...·  8 月前    · 
儒雅的冲锋衣  ·  [vue] await ...·  1 年前    · 
儒雅的保温杯  ·  c# - ...·  10 月前    · 
干练的充电器  ·  java ...·  1 年前    · 
小眼睛的葫芦  ·  tar ...·  1 年前    · 

碰到一个需求,在 <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值取错了,那么会报。