在vue自定义组件中使用 v-model指令详情

yizhihongxing

下面是详细讲解“在vue自定义组件中使用 v-model指令”的攻略。

什么是v-model

v-model 指令在表单元素上创建了双向数据绑定。当表单元素的值发生变化时,其绑定的数据也会跟着变化;反之,当数据发生变化时,表单元素的值也会跟着变化。v-model在vue中非常常用。

Vue自定义组件中使用v-model

在 Vue 自定义组件中使用 v-model 其实跟在输入框中使用 v-model 一样简单,只需要在组件中的 model 选项里声明属性名和事件名即可,在组件中通过 $emit 触发事件来更新父组件中绑定的数据。

一个自定义组件的 v-model 可以使用以下三个名字中的一个来定义:

  • value作为组件 prop 的值,用于显示传入的值
  • input作为组件事件的名称,用于更新传入的值
  • change选择性地作为组件事件的名称,用于在 <input> 元素的 change 事件触发时更新传入的值

下面是实现自定义组件的完整步骤:

  1. 在父组件中使用 v-model 指令,将一个属性绑定到子组件的 prop 上:
<template>
  <div>
    <custom-input v-model="inputValue"></custom-input>
    <p>{{inputValue}}</p>
  </div>
</template>

<script>
import CustomInput from "./CustomInput.vue";
export default {
  components: {
    CustomInput
  },
  data() {
    return {
      inputValue: "Hello World"
    };
  }
};
</script>
  1. 在子组件中使用model选项声明属性和事件:
<template>
  <div>
    <input :value="value" @input="$emit('input', $event.target.value)" />
  </div>
</template>

<script>
export default {
  name: "CustomInput",
  props: ["value"]
};
</script>

在这个例子中,我们声明 value 作为子组件的 prop,然后在使用 v-model 的地方绑定 inputValue,其中的 v-model 相当于以下代码:

<custom-input :value="inputValue" @input="inputValue = $event"></custom-input>

同时,在子组件中使用 model 选项,它将绑定到父组件的 inputValue 属性和 input 事件:

<input :value="value" @input="$emit('input', $event.target.value)" />

这里内部的 value ,会自动启用 props ,所以会与 CustomInput 组件的 value 绑定,这里建议使用 props 属性来作为初始值传递。

示例1

为了更好的理解,我们用一个实际的例子来演示如何使用 v-model 定义一个自定义的表单控件。

下面是一个匹配密码的表单控件,它包含两个输入框:

// PasswordMatch.vue
<template>
  <div>
    <input type="password" :value="password" @input="$emit('input', $event.target.value)" placeholder="Password">
    <input type="password" :value="confirmPassword" @input="$emit('update:confirmPassword', $event.target.value)" placeholder="Confirm Password">
  </div>
</template>

<script>
export default {
  name: 'PasswordMatch',
  props: {
    value: {
      type: String,
      default: ''
    },
    confirmPassword: {
      type: String,
      default: ''
    }
  },
  model: {
    prop: 'value',
    event: 'input'
  }
}
</script>

在这个例子中,我们定义了两个输入框:一个是 password 输入框,另一个是 confirmPassword 输入框。

我们通过 v-model 指令将 password 的值与父组件中的一个变量 password 绑定,同时将 confirmPassword 的值绑定到一个自定义 prop confirmPassword 上。

这里我们使用 update: 前缀来声明一个自定义事件,以支持 v-model 的双向绑定功能,并在改变 confirmPassword 的值时触发此事件。

父组件使用该控件时,如下所示:

<template>
  <div>
    <label>Password: </label><br>
    <password-match v-model="password" :confirmPassword="confirmPassword"></password-match>
    <br><br>
    <button @click="submit">Submit</button>
  </div>
</template>

<script>
import PasswordMatch from './PasswordMatch.vue';
export default {
  name: 'App',
  components: { PasswordMatch },
  data() {
    return {
      password: '',
      confirmPassword: ''
    };
  },
  methods: {
    submit() {
      alert(`Password: ${this.password}\nConfirm Password: ${this.confirmPassword}`);
    }
  }
}
</script>

在这个例子中,我们使用了 v-model 将父组件中的 password 变量绑定到 PasswordMatch 组件的 password 属性上,并将父组件中的 confirmPassword 变量作为 PasswordMatch 组件的 confirmPassword 属性传递。

当用户更改 password 或 confirmPassword 的值时,父组件中的变量也会随之改变。这样,我们就实现了一个简单的双向绑定的表单控件。

示例2

下面是一个简单的应用场景,在这个场景中,我们需要创建一个选择框,其中包含多个选项。在选择框中选中一个选项后,我们需要在父组件中获取所选选项的值。

// SelectBox.vue
<template>
  <div>
    <select :value="selected" @change="$emit('change', $event.target.value)">
      <option :value="null" disabled>Select a fruit</option>
      <option v-for="option in options" :value="option.id" :key="option.id">{{ option.name }}</option>
    </select>
  </div>
</template>

<script>
export default {
  name: 'SelectBox',
  props: {
    options: { 
      type: Array,
      default: () => []
    },
    value: {},
  },
  computed: {
    selected: {
      get() {
        return this.value;
      },
      set(value) {
        this.$emit('input', value);
      }
    }
  }
}
</script>

在这个例子中,我们使用 v-model 将选择框的值绑定到父组件中的一个变量中。

我们使用 computed 属性来处理 v-model 的双向绑定。通过定义 selected 属性,我们可以在设置和获取时触发 $emit('input', value) 事件。

父组件使用该控件时,如下所示:

<template>
  <div>
    <label>Select a fruit: </label>
    <select-box v-model="selectedFruit" :options="fruits"></select-box>
    <br>
    <br>
    <p>You have selected: {{ selectedFruit }}</p>
  </div>
</template>

<script>
import SelectBox from './SelectBox.vue';
export default {
  name: 'App',
  components: { SelectBox },
  data() {
    return {
      selectedFruit: null,
      fruits: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    };
  }
}
</script>

在这个例子中,我们通过 v-model 绑定了父组件中的 selectedFruit 变量到 SelectBox 组件的 value。

当用户选择一个水果时,selectedFruit 变量的值也会更新。

这就是在 Vue 自定义组件中使用 v-model 的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在vue自定义组件中使用 v-model指令详情 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue3无法使用jsx的问题及解决

    让我们来详细讲解一下“Vue3无法使用JSX的问题及解决”的攻略。 问题描述 在Vue2中,由于Vue默认使用的模板语言是HTML-Based的,因此不支持JSX,这意味着在Vue2中我们无法直接使用JSX编写组件。 在Vue3中,Vue团队引入了一个新的API——createRenderer()。这个API以渲染器为基础,为Vue提供了更灵活的渲染方式。 …

    Vue 2023年5月28日
    00
  • Vue3对比Vue2的优点总结

    Vue3对比Vue2的优点总结 1. 更快的速度 Vue3使用了Proxy对象,通过动态代理实现了响应式系统,比Vue2使用的Object.defineProperty()更加高效。Vue3还优化了渲染流程,比Vue2更快。 Vue3还支持组合式API,可以更灵活的管理组件中的逻辑和状态。 2. 更好的TypeScript支持 Vue3内置了TypeScri…

    Vue 2023年5月27日
    00
  • ant design vue 表格table 默认勾选几项的操作

    Ant Design Vue 表格(Table)默认勾选几项的操作,可以通过在表格数据中为需要默认勾选的行数据添加一个 selected 属性,并且在表格操作栏添加一个全选按钮,并将其与表格的 rowSelection 属性绑定起来即可实现。 以下是完整的实现步骤: 设置表格数据源 首先,需要设置表格的数据源,可以使用一个数组对象来模拟,示例代码如下: da…

    Vue 2023年5月28日
    00
  • Vue路由应用详细讲解

    Vue 路由应用详细讲解 Vue.js 是一个流行的前端 JavaScript 框架,它强大并且灵活,可以快速搭建前端应用。在 Vue.js 中,路由是一种实现前端页面切换的技术,通过路由可以实现前端应用的页面跳转。 基本的 Vue.js 路由配置 在 Vue.js 中,我们可以通过 vue-router 模块来实现路由功能。下面是一个基本的路由配置示例: …

    Vue 2023年5月27日
    00
  • 详解vue.js之props传递参数

    关于“详解vue.js之props传递参数”,我会分几个方面进行讲解,以确保回答完整细致。具体的内容如下: 简介 在 Vue.js 中,组件之间的通信是很重要的一环。其中,props 和 events 是两个最基本的通信方式。props 是父组件向子组件传递数据的方式,而 events 则是子组件向父组件发送消息的方式。在这里,我们主要关注 props 传递…

    Vue 2023年5月29日
    00
  • vue小白入门教程

    Vue小白入门教程攻略 Vue.js是现在最火热的前端框架之一。它提供了一种简洁、高效的方式来构建现代化的Web应用程序。本教程将引导您轻松入门并开始使用Vue.js构建您的第一个Web应用程序。 步骤1: 安装Vue.js Vue.js可以通过CDN链接或者通过下载文件的形式来引入到页面中。我们推荐使用CDN链接的方式来引入Vue.js。 在你的HTML文…

    Vue 2023年5月28日
    00
  • 超级详细的Vue安装与配置教程

    超级详细的Vue安装与配置教程 安装Node.js 首先需要安装Node.js,可以在官网下载对应平台的安装包:https://nodejs.org/en/download/ 安装完成后,打开终端或命令行工具,输入以下命令来检查是否安装成功: node -v npm -v 如果能够成功输出版本号,说明Node.js已经安装成功。 安装Vue CLI Vue官…

    Vue 2023年5月27日
    00
  • 使用Vue3进行数据绑定及显示列表数据

    下面我将详细讲解使用Vue3进行数据绑定及显示列表数据的完整攻略。 步骤一:创建Vue对象 首先,需要使用createApp方法创建Vue实例,并通过mount方法将Vue实例挂载到页面上。示例代码如下: “`html <div id="app"> <ul> <li v-for="item in …

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部