在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日

相关文章

  • 一份超级详细的Vue-cli3.0使用教程【推荐】

    一份超级详细的Vue-cli3.0使用教程 简介 Vue-cli3.0是Vue.js 官方提供的一个基于 webpack4 和 Webpack-dev-server 的脚手架工具,用于快速构建vue项目开发环境。本教程将为您带来Vue-cli3.0的完整使用攻略,从安装到构建一个简单的Vue项目,让你轻松掌握Vue-cli3.0的使用方法。 安装Vue-cl…

    Vue 2023年5月28日
    00
  • Vue关于组件化开发知识点详解

    下面是关于Vue的组件化开发的详细攻略。 1. 什么是组件化开发 组件化开发是一种将一个大型项目拆分成多个小的可重用组件的方法。每个组件都封装了自己的数据和方法,可在不同的页面和应用中被重复利用。 Vue.js 是一个专注于数据驱动的渐进式 JavaScript 框架,它通过其丰富的生命周期钩子函数和强大的响应式数据绑定机制,使得组件化开发得以高效实现。 2…

    Vue 2023年5月27日
    00
  • Vue项目总结之webpack常规打包优化方案

    那我们就来详细讲解一下“Vue项目总结之webpack常规打包优化方案”的完整攻略,包括以下内容: 一、Webpack基础知识 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器。它会递归地构建一个依赖关系图,在这个过程中将每个模块视为一个节点,并将模块之间的依赖关系转换为图中的边。 我相信作为一个Vue开发者,你一定已经熟练掌握了W…

    Vue 2023年5月28日
    00
  • axios中post请求json和application/x-www-form-urlencoded详解

    Axios中POST请求JSON和application/x-www-form-urlencoded详解 什么是POST请求? POST请求是HTTP协议中的一种请求方式,在请求体中携带需要传输的数据。可能被用于编辑、更新、上传等操作。POST请求方式相对于GET请求方式来说,更加安全和灵活,所以在实际开发中被广泛使用。 axios中POST请求的两种方式 …

    Vue 2023年5月27日
    00
  • 解决vue单页面应用打包后相对路径、绝对路径相关问题

    解决Vue单页面应用打包后相对路径、绝对路径相关问题是一个常见的问题,这里提供一个完整攻略,以帮助开发者快速解决问题。 问题描述 在开发Vue单页面应用时,需要引入各种资源文件,如CSS样式文件、JS脚本文件、图片资源文件等等。这些文件在开发时,都是通过相对路径或绝对路径引入的。但是,在打包完成后,这些资源文件会被压缩和合并,导致相对路径或绝对路径失效,进而…

    Vue 2023年5月28日
    00
  • Vue动态类的几种使用方法总结

    Vue动态类的几种使用方法总结 在Vue中,我们可以通过动态绑定class来实现根据条件来动态添加/删除对应的类,这也是实现复杂的样式变化的常用方式。本文将总结Vue中动态绑定class的几种使用方法,并提供相应的示例说明。 1. 对象语法 最基础的动态绑定class的方式是采用对象语法,其基本格式为: <div :class="{ clas…

    Vue 2023年5月28日
    00
  • Vue 搭建Vuex环境详解

    Vue 搭建Vuex环境详解 简介 Vuex是Vue.js的官方状态管理库,它可以更好的管理Vue.js应用中的数据流,包括数据的状态、存储和同步。社区中已经有很多文章介绍Vuex的基础使用,本文将详细讲解如何在Vue.js中搭建Vuex环境,并提供两个示例说明。 搭建Vuex环境 安装Vuex 在Vue.js项目中使用Vuex,需要先安装它。 npm in…

    Vue 2023年5月28日
    00
  • vue:内存泄露详解

    下面我将为您详细讲解 “vue:内存泄露详解” 的攻略。 1. 什么是内存泄漏? 内存泄漏指程序在申请内存后,由于某种原因,未能及时归还系统造成的系统内存浪费的现象。在一个程序正常的运行过程中,为了提高效率,程序会申请内存。但是程序员忘记了回收内存,或者程序代码中存在内存泄漏缺陷,导致程序在一段时间后出现卡顿或者崩溃的现象。 2. Vue中的内存泄漏 在Vu…

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