如何在组件渲染后聚焦到特定的输入文本?
How to focus on a specific input text after the component is rendered?
每次渲染组件时,我都在努力使它正常工作,方法是使用像这样的路由器对象推送它this.$router.push('/Home/mypath');
,它将仅关注索引 = 0 之后的第一个输入文本元素即使我为索引传递了另一个值,组件也会被渲染。基本上,我将索引值传递给输入文本元素的 ref,该元素位于组件的 v-for 循环内,因此在 mounted()
, 我有这样的东西
mounted() {
this.$nextTick(() =>
{
this.$refs.newInp[index].focus();
});
}
但它一直关注第一个输入元素,即使我传递了 1 或 2 的值。当我查看控制台日志时,它在控制台上显示此错误。
类型错误:无法读取未定义的 属性“0”
指向这条线 this.$refs.newInp[index].focus();
用于在 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>
如何解决此类问题?解决方案是什么?
谢谢。
据我了解,您想在获取一些数据后聚焦 textarea
,这表示尝试在 mounted
方法内部聚焦是行不通的,因为您无法判断数据是否具有正在获取并且 textarea
已经存在于 DOM.
中
所以最好的方法是在确保数据已被提取后,在 then
回调中集中注意力。
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>
经过几天的研究、全面测试和观察 DOM 行为,了解 vue.js 如何呈现组件,当然还基于此线程中其他人的建议。我意识到你 不能 真正关注 for 循环中元素的特定索引的 created/mounted 属性,特别是在这种情况下,如果正在获取数据,则为输入文本元素由于组件的异步行为,绑定组件来自服务器,您必须等到组件完全呈现。因此,我至少在我的案例中找到了一个解决方案,即在创建或安装的属性中使用动态观察器,并为数据属性的默认更改设置虚拟或重复数据属性,目的只是为了激活观察器以专注于组件渲染后的特定元素。这是它的样子。希望对遇到和我一样情况的朋友有所帮助。
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;
},
}
每次渲染组件时,我都在努力使它正常工作,方法是使用像这样的路由器对象推送它this.$router.push('/Home/mypath');
,它将仅关注索引 = 0 之后的第一个输入文本元素即使我为索引传递了另一个值,组件也会被渲染。基本上,我将索引值传递给输入文本元素的 ref,该元素位于组件的 v-for 循环内,因此在 mounted()
, 我有这样的东西
mounted() {
this.$nextTick(() =>
{
this.$refs.newInp[index].focus();
});
}
但它一直关注第一个输入元素,即使我传递了 1 或 2 的值。当我查看控制台日志时,它在控制台上显示此错误。
类型错误:无法读取未定义的 属性“0”
指向这条线 this.$refs.newInp[index].focus();
用于在 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>
如何解决此类问题?解决方案是什么? 谢谢。
据我了解,您想在获取一些数据后聚焦 textarea
,这表示尝试在 mounted
方法内部聚焦是行不通的,因为您无法判断数据是否具有正在获取并且 textarea
已经存在于 DOM.
所以最好的方法是在确保数据已被提取后,在 then
回调中集中注意力。
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>
经过几天的研究、全面测试和观察 DOM 行为,了解 vue.js 如何呈现组件,当然还基于此线程中其他人的建议。我意识到你 不能 真正关注 for 循环中元素的特定索引的 created/mounted 属性,特别是在这种情况下,如果正在获取数据,则为输入文本元素由于组件的异步行为,绑定组件来自服务器,您必须等到组件完全呈现。因此,我至少在我的案例中找到了一个解决方案,即在创建或安装的属性中使用动态观察器,并为数据属性的默认更改设置虚拟或重复数据属性,目的只是为了激活观察器以专注于组件渲染后的特定元素。这是它的样子。希望对遇到和我一样情况的朋友有所帮助。
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;
},
}