Vue.js 3 在方法中使用 ref 对输入使用自动对焦
Vue.js 3 use autofocus on input with ref inside a method
我曾使用 Vue2,但我最近尝试使用 Vue 3。
我有一个简单的问题:
<input ref="myinput" />
<button @click="submitData" />
我想在函数“submitData”中将“焦点”设置在“myinput”上。
在 Vue 2 中它很简单 (this.$refs ...),但在 Vue 3 中,它们使它变得复杂。
我看到了带有“设置”的示例,但对我没有用+我认为您只能从元素访问“值”。
有什么方法可以在方法内部对元素执行“焦点”吗?
你仍然可以使用 Vue 3 做同样的事情,但是如果你使用组合 api 会有一些不同:
选项API:
const {
createApp
} = Vue;
const App = {
data() {
return {
}
},
methods: {
submitData() {
this.$refs.myinput.focus()
}
},
mounted() {
}
}
const app = createApp(App)
app.mount('#app')
<script src="https://unpkg.com/vue@3.0.0-rc.11/dist/vue.global.prod.js"></script>
<div id="app">
Vue 3 app
<input ref="myinput" />
<button @click="submitData">
Submit
</button>
</div>
作文API:
const {
createApp,
ref,
onMounted,
} = Vue;
const App = {
setup() {
const myinput = ref(null)
function submitData() {
myinput.value.focus()
}
return {
myinput,
submitData
}
}
}
const app = createApp(App)
app.mount('#app')
<script src="https://unpkg.com/vue@3.0.0-rc.11/dist/vue.global.prod.js"></script>
<div id="app">
Vue 3 app
<input ref="myinput" />
<button @click="submitData">
Submit
</button>
</div>
万一有人遇到这个问题想在 Vue3 中设置特定元素的自动对焦,您可以使用 Vue Custom Directive
const { createApp, onMounted } = Vue;
const app = createApp({})
// Register a global custom directive called `v-focus`
app.directive('focus', {
// When the bound element is mounted into the DOM...
mounted(el) {
// Focus the element
el.focus()
}
})
app.mount('#app')
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
<input />
<input v-focus />
<input />
</div>
我试图 select 在加载表单组件时进行特定输入。
上面的例子没什么用,自己想办法
恕我直言,这要简单得多。在mounted hook中添加1个ref标签和1行代码
在您要关注的项目上放置一个 ref 标签。我在这里将其命名为“formStart”,但您可以随意命名。
<form @submit.prevent="createNewRoute">
<label for="code">Code</label>
<input v-model="code" id="code" type="text" ref="formStart" /> <!-- REF TAG HERE -->
<label for="type">Type</label>
<input v-model="type" id="type" type="text" />
/* Other inputs hidden for simplicity */
<button type="submit">Add Route</button>
</form>
在 mounted
挂钩和 focus()
中引用 ref 标签。
<script>
export default {
/* Other options hidden for simplicity */
mounted() {
this.$refs.formStart.focus(); // FOCUS ELEMENT HERE
},
};
</script>
此处缺少我找到的最简单的答案
<input type="text" autofocus />
另一个普通的解决方案是:
document.getElementById("code")?.focus()
在 onMounted
被调用
在某些情况下,当输入隐藏在 v-show 或 v-if 下时,需要执行 nextTick 才能使焦点生效。
<span
v-show="!editMode"
@click="handleEditionMode"
>
{{ content }}
</span>
<input
v-show="editMode"
ref="input"
v-model="content"
aria-describedby="item-content"
name="content"
type="text"
tabindex="0"
@focusout="editMode = false"
@keydown.enter="editMode = false"
/>
const input = ref(null),
editMode = ref(false);
const handleEditionMode = () => {
editMode.value = true;
nextTick(() => {
input.value.focus();
});
};
我曾使用 Vue2,但我最近尝试使用 Vue 3。
我有一个简单的问题:
<input ref="myinput" />
<button @click="submitData" />
我想在函数“submitData”中将“焦点”设置在“myinput”上。 在 Vue 2 中它很简单 (this.$refs ...),但在 Vue 3 中,它们使它变得复杂。 我看到了带有“设置”的示例,但对我没有用+我认为您只能从元素访问“值”。
有什么方法可以在方法内部对元素执行“焦点”吗?
你仍然可以使用 Vue 3 做同样的事情,但是如果你使用组合 api 会有一些不同:
选项API:
const {
createApp
} = Vue;
const App = {
data() {
return {
}
},
methods: {
submitData() {
this.$refs.myinput.focus()
}
},
mounted() {
}
}
const app = createApp(App)
app.mount('#app')
<script src="https://unpkg.com/vue@3.0.0-rc.11/dist/vue.global.prod.js"></script>
<div id="app">
Vue 3 app
<input ref="myinput" />
<button @click="submitData">
Submit
</button>
</div>
作文API:
const {
createApp,
ref,
onMounted,
} = Vue;
const App = {
setup() {
const myinput = ref(null)
function submitData() {
myinput.value.focus()
}
return {
myinput,
submitData
}
}
}
const app = createApp(App)
app.mount('#app')
<script src="https://unpkg.com/vue@3.0.0-rc.11/dist/vue.global.prod.js"></script>
<div id="app">
Vue 3 app
<input ref="myinput" />
<button @click="submitData">
Submit
</button>
</div>
万一有人遇到这个问题想在 Vue3 中设置特定元素的自动对焦,您可以使用 Vue Custom Directive
const { createApp, onMounted } = Vue;
const app = createApp({})
// Register a global custom directive called `v-focus`
app.directive('focus', {
// When the bound element is mounted into the DOM...
mounted(el) {
// Focus the element
el.focus()
}
})
app.mount('#app')
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
<input />
<input v-focus />
<input />
</div>
我试图 select 在加载表单组件时进行特定输入。
上面的例子没什么用,自己想办法
恕我直言,这要简单得多。在mounted hook中添加1个ref标签和1行代码
在您要关注的项目上放置一个 ref 标签。我在这里将其命名为“formStart”,但您可以随意命名。
<form @submit.prevent="createNewRoute">
<label for="code">Code</label>
<input v-model="code" id="code" type="text" ref="formStart" /> <!-- REF TAG HERE -->
<label for="type">Type</label>
<input v-model="type" id="type" type="text" />
/* Other inputs hidden for simplicity */
<button type="submit">Add Route</button>
</form>
在 mounted
挂钩和 focus()
中引用 ref 标签。
<script>
export default {
/* Other options hidden for simplicity */
mounted() {
this.$refs.formStart.focus(); // FOCUS ELEMENT HERE
},
};
</script>
此处缺少我找到的最简单的答案
<input type="text" autofocus />
另一个普通的解决方案是:
document.getElementById("code")?.focus()
在 onMounted
在某些情况下,当输入隐藏在 v-show 或 v-if 下时,需要执行 nextTick 才能使焦点生效。
<span
v-show="!editMode"
@click="handleEditionMode"
>
{{ content }}
</span>
<input
v-show="editMode"
ref="input"
v-model="content"
aria-describedby="item-content"
name="content"
type="text"
tabindex="0"
@focusout="editMode = false"
@keydown.enter="editMode = false"
/>
const input = ref(null),
editMode = ref(false);
const handleEditionMode = () => {
editMode.value = true;
nextTick(() => {
input.value.focus();
});
};