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

下面是详细讲解“在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日

相关文章

  • webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)

    下面是详细讲解“webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)”的完整攻略。 问题背景 当我们使用webpack打包vue项目时,生成的js、css、图片等静态资源文件可能会存在404的问题,这是由于打包后资源文件的路径问题所导致的。 具体解决步骤 接下来,介绍具体的解决步骤,包括以下几个方面: 步骤1:检查public…

    Vue 2023年5月28日
    00
  • Vue中使用定时器(setInterval、setTimeout)的两种方式

    Vue是一款流行的JavaScript前端框架,开发者常常需要在Vue中使用定时器,来实现许多不同的功能,例如:轮播图、自动刷新等等。Vue中有两种主要的方式可以使用定时器:基础绑定方式和组件方法。 基础绑定方式 基础绑定方式是通过Vue自带的指令v-bind实现的,一般选择setTimeout的方式。语法如下: <template> <d…

    Vue 2023年5月29日
    00
  • 关于vue中的时间格式转化问题

    关于Vue中的时间格式转化问题,我为你详细讲解以下攻略。 问题描述 在Vue应用开发中,我们经常会遇到需要将日期时间格式进行转化的情况。例如从后端API接口中获取的时间戳需要格式化成常用的日期时间格式,或者用户在前端输入的日期时间字符串需要转换为时间戳等。在这样的场景下,我们需要掌握Vue中时间格式转化的方法。 解决方法 Vue中内置了许多过滤器(Filte…

    Vue 2023年5月28日
    00
  • laravel5.4+vue+element简单搭建的示例代码

    下面详细讲解如何搭建“laravel5.4+vue+element简单搭建的示例代码”,并提供两个示例说明。 准备工作 安装composer 安装laravel5.4 安装npm 安装vue 安装element-ui 搭建步骤 1. 初始化Laravel项目 使用如下命令初始化一个laravel项目: composer create-project –pr…

    Vue 2023年5月28日
    00
  • springboot vue接口测试前端动态增删表单功能实现

    下面是关于“springboot vue接口测试前端动态增删表单功能实现”的完整攻略: 一、概述 这篇攻略介绍了如何使用Spring Boot和Vue.js构建一个带有动态增删表单功能的前端页面,并且可以通过接口测试实现数据的增删查改等操作。 二、环境搭建 为了正确地使用Spring Boot和Vue.js开发本示例,我们需要安装以下环境: Java Dev…

    Vue 2023年5月28日
    00
  • mpvue+vuex搭建小程序详细教程(完整步骤)

    这里给您详细讲解一下“mpvue+vuex搭建小程序详细教程(完整步骤)”。 简介 本教程将介绍如何使用 mpvue 和 vuex 搭建一个小程序。mpvue 是一个使用 Vue.js 开发小程序的前端框架,而 vuex 则是 Vue.js 的状态管理工具。本次教程的重点是如何使用 vuex 在 mpvue 中控制状态的管理。 步骤 1. 创建一个 mpvu…

    Vue 2023年5月27日
    00
  • 如何在vue项目中使用UEditor–plus

    步骤1:安装UEditor 首先,我们需要安装UEditor及其附加组件。你可以通过以下命令来安装UEditor: npm i -S vue-ueditor-plus 这样就将UEditor安装到了你的项目中。 步骤2:在项目中注册组件 现在,我们需要在Vue组件中注册UEditor组件。在你的项目中,你需要创建一个UEditor组件,代码如下: <t…

    Vue 2023年5月27日
    00
  • vue3.2自定义弹窗组件结合函数式调用示例详解

    下面我来详细讲解“vue3.2自定义弹窗组件结合函数式调用示例详解”的完整攻略。 1. 简介 在Vue3.2中,我们可以通过自定义弹窗组件来方便地实现页面弹窗的功能,并且通过函数式调用的方式来减少对全局状态的依赖。 2. 自定义弹窗组件 首先,我们需要创建一个自定义的弹窗组件。可以使用Vue3的defineComponent函数来定义组件,代码如下: imp…

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