在我的Vue.js组件中,我根据以下项目列表渲染了包含textarea
的表行:
<template>
<div>
<table>
<tr v-for="(item, index) in items">
<td>{{ index }}</td>
<td><textarea v-model="item.message"></textarea></td>
</tr>
</table>
</div>
</template>
<script>
export default {
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
};
</script>
当我单击一行中的任意位置时,我希望该行内的textarea
处于焦点状态。我该怎么办?
以下代码无法解决问题:
this.$refs.myTextArea.focus();
这仅适用于具有唯一参考id
并且在v-for
之外的元素。
答案 0 :(得分:2)
尝试为每个文本区域指定唯一的引用名称,例如:
<tr v-for="(item, index) in items" @click="focus('ta'+index)">
<td>{{ index }}</td>
<td><textarea v-model="item.message" :ref="'ta'+index"></textarea></td>
</tr>
focus
方法:
methods:{
focus(key){
this.$refs[key][0].focus()
}
}
选中此demo
答案 1 :(得分:1)
您是否尝试过为每行的ref添加动态值?
然后,您可以对单击事件做出反应,并根据该属性选择适当的文本区域。
类似的东西:
<template>
<div>
<table>
<tr v-for="(item, index) in items" v-on:click="focusTextArea(index)">
<td>{{ index }}</td>
<td>
<textarea ref="textArea{{index}}" v-model="item.message"></textarea>
</td>
</tr>
</table>
</div>
</template>
<script>
export default {
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
},
methods: {
focusTextArea: (textAreaIndex) => {
this.$refs[`textArea{textAreaIndex}`].$el.focus();
}
}
};
</script>