Vue.js 3在方法内使用ref对输入进行自动聚焦

3zwjbxry  于 2022-12-23  发布在  Vue.js
关注(0)|答案(7)|浏览(442)

我以前用过Vue 2,但最近尝试了Vue 3。
我有个简单的问题:

<input ref="myinput" />
 <button @click="submitData" />

我想在函数“submitData”中的“myinput”上设置“focus”。在Vue 2中它很简单(这个.$refs...),但是在Vue 3中,他们把它变得很复杂。我看到了带有“setup”的示例,但是对我来说没有用+我认为你只能从元素中访问“value”。
有没有办法在方法中的元素上执行“focus”?

lvjbypge

lvjbypge1#

您仍然可以使用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:**

一个二个一个一个

bzzcjhmw

bzzcjhmw2#

如果有人想在Vue3中设置特定元素的自动聚焦,您可以使用VueCustomDirective来实现

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>
hjqgdpho

hjqgdpho3#

我找到的最简单的答案在这里不见了

<input type="text" autofocus />
rkttyhzu

rkttyhzu4#

在某些情况下,当输入隐藏在v-显示或v-下时,如果有必要执行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();
    });
};
3pmvbmvn

3pmvbmvn5#

另一个常规解决方案是:
第一个月
将在onMounted上调用

nlejzf6q

nlejzf6q6#

我试图在加载表单组件时选择一个特定的输入。
上面的例子没有什么用,所以我自己想通了。
这要简单得多,恕我直言。在安装的钩子中添加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>
brvekthn

brvekthn7#

<div
            v-if="openmodal"
            tabindex="0"
            v-focus
            @keydown.right="() => nextimage(1)"
        >
       </div>

我使用了@webcu的方法,并添加了tabindex=“0”,这是工作!

相关问题