当前位置: 首页 > 知识库问答 >
问题:

如何在呈现组件后聚焦于特定的输入文本?

司马念
2023-03-14

每次渲染组件时,我都在努力使其正常工作,方法是使用router对象推送组件,例如this$路由器。推送('/Home/mypath') ,即使我为index传递了另一个值,它也只会在呈现组件后关注index=0的第一个输入文本元素。基本上,我将一个索引值传递给输入文本元素的ref,该元素位于组件的v-for循环中,因此在mounted(),我有如下内容

mounted() {
  this.$nextTick(() => 
  {                
      this.$refs.newInp[index].focus();          
    });
  }

但是它仍然关注第一个输入元素,即使我传递了1或2的值。当我查看控制台日志时,它在控制台上显示了这个错误。类型错误:无法读取属性'0'的未定义指向这一行this.$refs.newInp[index]. point();

获取v-for中数据的示例代码

async GetContentDetails() {
     let testRes =
         await axios.get('myUrl/api', {
              params: {
                   ContentId: this.$cookie.get('OpV-ContId')
                      }
                 }).then(res => this.contentItems = res.data)
                      .then()
                      .catch(error => console.log(error));
                this.testData = testRes;
}

模板:

<div v-for="(contItem, index) in contentItems" :key="contItem.commentId">
  <textarea class="reply-commented" ref="newInp"></textarea>
  </div>

如何解决这类问题?解决这个问题的办法是什么?谢谢


共有2个答案

郗唯
2023-03-14

对DOM行为进行了几天的研究和彻底的测试,并观察了如何使用vue。js呈现组件,当然是基于其他人对此线程的建议。我意识到,如果要在组件上进行绑定的数据由于其异步行为而来自服务器,并且您必须等待组件完全呈现,那么您就不能真正将焦点放在for循环中某个元素的特定索引上,尤其是在本例中,输入文本元素。因此,我找到了一个解决方案,至少在我的案例中,在创建的或装入的属性中使用动态观察者,并为数据属性的默认更改设置虚拟或重复数据属性,以便在呈现组件后仅激活观察者以关注特定元素。这就是它的样子。希望这对遇到和我一样情况的人有所帮助。

created() {           
            this.GetContentDetails();
            this.$watch('commentItems2', function () {
                this.$nextTick(() => {
                    this.$refs.newRep[mapCredential.state.index2].focus();
                });
            });
        },

methods: {
 async GetComment2() {
                let testRes =
                    await axios.get('myUrl/api/GetContent/GetComments')
                        .then(this.GetReply2())
                        .catch(error => console.log(error));
                this.commentItems = testRes.data;
                this.commentItems2 = testRes.data;
            },
}
宰父淳
2023-03-14

据我所知,在获取一些数据后,您希望聚焦textarea,也就是说,在mounted方法中尝试聚焦是行不通的,因为您无法判断数据是否已被获取,并且textarea已经存在于DOM中。

因此,最好的方法是在确保数据已被提取后,在然后回调中聚焦。

new Vue({
  el: '#app',
  
  data: {
    posts: [],
    index: 3 // Change this to focus whatever textarea you want
  },
  
  mounted () {
    this.fetchItems();
  },
  
  methods: {
    fetchItems () {
      const url = 'https://jsonplaceholder.typicode.com/posts'

      axios.get(url).then(response => {
        this.posts = response.data
        
        this.$nextTick(_ => {
          this.$refs.newInp[this.index].focus()
        })
      })
    }
  }
});
<div id="app"> 
  <div v-for="(post, index) in posts" :key="post.id">
    <textarea class="reply-commented" ref="newInp" v-text="post.body"></textarea>
  </div> 
</div>



<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

 类似资料:
  • 我有一个样式化的组件: 当安装使用它的组件时,我想

  • 我正在使用purescript卤素构建一个类似电子表格的表格(类似于Handsontable)。如果双击某个单元格,则html输入元素将作为相应表格单元格的子元素呈现(并且不会为所有其他单元格呈现此类元素)。 这对卤素非常有效,除了我不知道如何自动将焦点设置为新创建的输入元素。 我尝试了属性,但这只适用于双击的第一个单元格。JavaScript的方法是在新元素上调用方法,但是我不知道在DOM以卤素

  • 出于某种原因,PHPStorm决定呈现任何名为root的文件。js作为纯文本,无需js着色和调试。有人知道如何纠正这个问题吗???它快把我逼疯了!!!

  • 我是这个世界的新手,并试图进入这个世界。我正在编写一个样式指南,需要显示一些HTML代码作为示例。我使用的是ReactPrism,我无法在PrismCode组件中获得HTML输出,我已经找到了一个解决方法,使用ReactToJSX来显示jsx代码而不是HTML。代码如下: 因此,基本上我希望将this.props.children(组件)呈现为HTML代码,而不是PrismCode中的内容,我甚至

  • 这在当前版本的AngularJS中存在吗?我注意到代码中有一个BOOLEAN_ATTR,它获得AngularJS支持的所有attr。我不想修改它,因为害怕改变版本和忘记更新。

  • 问题内容: 我有输入要显示格式化的数字。通常,当它没有焦点时,应该显示一个格式化的字符串,例如’$ 50,000.00’。但是当它具有焦点时,它应该显示原始值,例如用于编辑的50000。 有内置功能吗?谢谢! 问题答案: 这是一条指令(),它可以执行您想要的操作。 请注意,只有元素的显示值才被格式化(模型值将始终为未格式化)。 这个想法是您为和事件注册侦听器,并根据元素的焦点状态更新显示值。 另请