Vue.js 教程

Vue.js 组件的 v-model

在 Vue.js 中,一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件。但是像单选框、复选框等类型的输入控件可能会将 value 属性用于不同的目的。model 选项可以用来避免这样的冲突,例如:

Vue.component('base-checkbox', {
   model: {
       prop: 'checked',
       event: 'change'
   },
   props: {
       checked: Boolean
   },
   template: `
       <input type="checkbox"
         v-bind:checked="checked"
         v-on:change="$emit('change', $event.target.checked)">
   `
})

现在在这个组件上使用 v-model 的时候:

<base-checkbox v-model="lovingVue"></base-checkbox>

这里的 lovingVue 的值将会传入这个名为 checked 的 prop。同时当 <base-checkbox> 触发一个 change 事件并附带一个新的值的时候,这个 lovingVue 的 property 将会被更新。

注意:注意你仍然需要在组件的 props 选项里声明 checked 这个 prop。

完整示例

<html>
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Vue</title>
   <!-- 使用 CDN 引入 Vue 库 -->
   <!-- <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> -->
   <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.9/vue.js"></script>
</head>
<body>

   <div id="app">
       <h1>lovingVue = {{ lovingVue }}</h1>
       <base-checkbox v-model="lovingVue"></base-checkbox>
   </div>

   <script type="text/javascript">
       Vue.component('base-checkbox', {
           // 定义 v-model 默认的属性名和事件
           model: {
               prop: 'checked',
               event: 'change'
           },
           props: {
               // 1.父组件传值给子组件
               // 将 lovingVue 的值传递给该 checked
               checked: Boolean
           },
           // 2.子组件将值传递给父组件
           // 通过 v-bind:checked 将 checked Prop 绑定到 checked 属性
           // 通过 v-on:change 将当前复选框的 checked 传递给父组件
           template: `
               <label>
                   <input type="checkbox"
                       v-bind:checked="checked"
                       v-on:change="$emit('change', $event.target.checked)" /> 复选框
               </label>
           `
       });

       var app = new Vue({
           el: "#app",
           data: {
               lovingVue: null
           }
       });
   </script>

</body>
</html>

运行效果如下图:

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号