关于 v-model 学习二

[上一篇 v-model] 的学习过程中,

我们知道了,一般在两种场景下,我们会使用到 v-model.

  • 使用在 input 表单元素上.
  • 使用在组件上.

但是使用在 input 元素上和使用在组件上在某种程度上来说,还是有很大的区别的.

在 v-mode 使用在 input 元素上时, v-model 帮我们做了两件事情.


<input type='text' v-model="data" />
  1. 将 data 的值使用 :value 属性绑定的形式绑定到了 input 元素的 value 属性上.
  2. 在父组件内,自动提供了@input的监听函数,仅此而已。

在组件上使用 v-model 时

<test-comp v-model="data"></test-comp>
  • dataprops 的形式传递到子组件内.
  • 子组件内定义props:['dataFrompartent'] 来接收父组件通过v-model传过来的值。
  • 子组件内部定义 model{prop:'dataFromParent',event:'fuckthisshitEvent'}来告知自己,父组件v-model传过来的值,在子组件内部要使用 dataFromParent 来接收。 子组件需要在改变父组件传递过来的值时,触发 fuckthisshitEvent 事件,并将需要改变的值传递出去(this.$emit('fuckthisshitEvent',e.target.value))

很大的区别在于:

由于子组件,是一个组件.默认情况下v-model 能做的事情,仅仅只是默认传个 props.value 给你,以及在我父组件内部默认监听你子组件内部不知道是谁发布的 input 事件.

但是在子组件中,或者说在子组件中,可能有很多 input 元素.那到底是谁需要用到这个 v-model 传递过来的值呢?

比如 里面有 2 个 input(一个用户名,一个密码),一个 checkbox 等等等.

那么父组件通过 props 传递过来的数据给谁用的?(用户名,密码,还是 checkbox?)

监听谁的事件?((用户名和密码框都是 input ,checkbox 则是 change)

所以,在组件上使用 v-model,我们需要在被接受 v-model 的子组件内进行更细致的配置.

因为默认在使用 v-model 往子组件传递数据时,父组件只负责传递 :value="data" & 在自己内部监听子组件发布出来的 input 事件.


如何配置 v-model 传递的 props 名字以及父组件监听的事件呢?

为什么要会 v-model的 prop 和 event 配置呢?

prop 呢 ? 不就是把数据以 :value 的方式传递进去吗?而且应该是给 input 元素使用不是吗?

event 呢? 默认是父组件监听 input 事件. 这有什么不好吗? 传给输入框使用,本身就应该监听 input 事件呀?为什么要改默认监听的事件呢?

道理也很简单:

在表单元素中,咱们用到的最多的可能就是 input 文本框输入.

对于输入框(比如 text textarea) 来说,:value 默认传进去正好好.

  • value 就是它们需要显示的内容.
  • input 正好也是它们的 value 在改变时触发的事件...(虽然也要子组件自己监听 dom 再 $emit 一次).

关键在于,input 表单元素,不只有输入框,还有 checkbox select 等.

首先 ,它们的 value 和 input 一样,不是给用户看的(虽然都是往后台提交的)
并且, 它们作为 input 元素来说,自己状态改变时的事件也不全是 input,有的是 change,比如 select 元素.

所以, 如果一直使用 组件的 v-model 的默认配置(value & input)显然是不合适的.

比如,我有一个组件,内部是一个 <select></select>.

所以,默认的 props.value 和 input 事件就不合适.

因为 value 不需要我传,内部的 <select></select> 本身就定义了 options . 而 options 里包含了 value.

input 事件也不合适, 因为 <select></select> 事件是 change.

于是,我们需要在包含了 <select></select> 组件的内部重新定义 v-model 的两个默认配置.

const TestComp = {
    model: {
      prop: 'getDataFromParentByVModel', // 将默认的 value props 改成 getDataFromParentByVModel
      event: 'change' // 让父组件默认监听 change 事件.
    },
    props: ['getDataFromParentByVModel']
  }
  
  • model.prop = 'getDataFromParentByVModel' 修改默认的 v-model 传递的属性绑定是 :value
  • event = 'change' 让提供了 v-model 的父组件默认的监听子组件发布出去的 change 事件.
  • props: ['getDataFromParentByVModel'] v-model 传递过来的是 getDataFromParentByVModel,在子组件内部还是得定义一下对应的 props (就想默认定义 props:['value']) 一样.

然后在子组件的内部:

let ChildComp = {
    template: `
        <div>
        //....other html and components
         <select :value="getDataFromParentByVModel" @change="hanlderSelectChange">
            <option disabled value="">请选择</option>
            <option>A</option>
            <option>B</option>
            <option>C</option>
         </select>
        </div>
    `,
    
    method: {
      hanlderSelectChange (e) {
        // 在这就要触发 change 事件了.
        this.$emit('change',e.target.value)
      }
    }
}


查看效果:

image.png
image.png
image.png

两边修改可以互相影响(这也就是 v-model 的作用所在).

其实传统的像什么父子组件间传值.

  • 父向子 使用 props .
  • 子向父 使用 $emit ..

但是上述两种常规做法,都是单向的.

组件上使用 v-model 也可以作为一个非常好用的父和子之间相[互传递数]据的一种方式.(双向的.)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • 在 vue 开发开发中, v-model 是一个非常常用的属性. 常规模式下,我们给定当前组件的某个 data 属...
    人话博客阅读 1,421评论 0 50
  • 组件(Component)是Vue.js最核心的功能,也是整个架构设计最精彩的地方,当然也是最难掌握的。...
    六个周阅读 5,517评论 0 32
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,102评论 0 25
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 3,290评论 0 3
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,122评论 0 6