在vue的学习中,一开始我是自己写组件练手的,在这个过程中我遇到一个问题:
props:父组件传递给子组件参数
(1)props直接在子组件里直接使用是可以实时更新的
(2)props如果在created,mounted等声明或者直接赋值给data的时候,再用data的时候是不可以实时更新的
(3)内部的data是可以实时更新的
(4)但是内部不可以强制去改变父元素传递过来的props,这样是官方不允许的而且是不严谨的

那么,我在写模态框组件的时候就产生一个很矛盾的问题,如果父级props控制了组件内部的显示和隐藏,
内部点击模态框阴影的时候也可以让其自动隐藏,我到底去修改什么值,修改了之后怎么去改变父组件传递过来的props,
给全局一个反馈呢。
在看过文章和自己动手操作后选取了一种方式,将内部的data和props进行关联,采用vue中v-modal的原理,值发生变化(input事件),
对应的数据也发生相应的改变:
不多说,直接贴代码:

子组件:
template:

<template ><div :value = "value" v-show = "isShow" ><div :class = "{active: isShow}" class = "modal msg" ><div @click = "onMaskClose" class = "modal-mask" ></div ><div class = "modal-wrapper" ><div :style = "{width: '428px'}" class = "modal-container" ><div class="header">模态框</div><div class = "body" ><div v-if="!$slots.content" v-html="content"></div><slot v-else="content" name="content"></slot></div ><div class = "footer" ><div @click = "onClick" class = "btn" >{{ btnTxt }}</div ></div ></div ></div ></div ></div >
</template >

javascript:

import { mapState, mapActions } from 'vuex'import _ from 'lodash'export default {name: "msg-modal",data () {return {isShow: this.value}},props: {value: {type: Boolean,default: false},closeable: {type: Boolean,default: false},btnTxt: {type: [String, Number],default: '确定'},content: {default: '内容'}},watch: {value (val) {this.isShow = val;},isShow (val) {this.$emit('input', val);}},computed: {...mapState({allAnchorList: state => state.anchor.list.data})},methods: {...mapActions(['removeAnchor']),onClick () {this.$emit('onClick')},onMaskClose () {if(!this.closeable) {return}Object.assign(this.$data, this.$options.data())}}}

less:

.modal {position: fixed;z-index: 800;top: 0;left: 0;width: 100%;height: 100%;display: table;transition: all .3s;background-color: transparent;&.active{opacity: 1;}.modal-mask {position: fixed;top: 0;left: 0;width: 100%;height: 100%;z-index: -1;background-color: rgba(0, 0, 0, .5);}.modal-wrapper {display: table-cell;vertical-align: middle;.modal-container {width: 300px;margin: 0 auto;border-radius: 2px;//box-shadow: 0 2px 8px rgba(0, 0, 0, .33);transition: all .3s ease;font-family: Helvetica, Arial, sans-serif;.header{position: relative;backgroud-color: #fff,min-height: 50px;}.modal-body {margin: 20px 0;}.footer {padding-bottom: 26px;overflow: hidden;border-bottom-left-radius: 4px !important;border-bottom-right-radius: 4px !important;background-color: #fff;.btn {height: 36px;line-height: 36px;width: 230px;margin: 0 auto;color: #fff;font-size: 14px;text-align: center;cursor: pointer;user-select: none;background-color: #2859ED;border-radius: 4px;}}}}
}

父组件的引用:
template:

<template ><div><MsgModalv-model = "show"content = "这是一段内容"@onClick = "handleClick"/></div>
</template >javascript:
<script >import MsgModal from './components/Modal/MsgModel'export default {name: 'App',data(){return {show: false}},components: {MsgModal},methods: {handleClick () {console.log('点击模态框确定按钮')}}}
</script >

样式随便写的,
主要就是用vue的v-model原理,将值与被传递的props实现双向绑定,
需要注意的是在组件mounted的时候需要对组件初始化中的传递的props赋值给绑定的v-model的value
自己也是才摸索vue全家桶阶段,才没做两个项目
有不足的地方请大家见谅和指导
欢迎大家讨论

vue中props的双向绑定相关推荐

  1. vue中如何实现双向绑定

    双向绑定的需要 在有些情况下,我们可能需要对一个 prop 进行"双向绑定".不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以变更父组件,且在父组件和子组件两侧都没有明显 ...

  2. vue中通过数据双向绑定给video标签的src赋值,只有第一次有效,怎么解决?

    场景:在一个视频列表页面,点击视频列表,则全屏播放视频.全屏播放是一个公用组件,每次点击视频列表则把该视频的播放地址通过vue的数据双向绑定到组件中的video标签,如下: <video con ...

  3. 如何在原生微信小程序中实现数据双向绑定

    官网:https://qiu8310.github.io/minapp/ 作者:Mora 在原生小程序开发中,数据流是单向的,无法双向绑定,但是要实现双向绑定的功能还是蛮简单的! 下文要讲的是小程序框 ...

  4. Vue之数据的双向绑定

    在vue中实现数据双向绑定的核心在于v-model 示例: <input type="text" name=" " v-model="userN ...

  5. 【说人话】真正意义上讲清楚了如何用$emit()在Vue.js的自定义组件中实现v-model=“”双向绑定

    子组件sg-component.vue代码 <template><div class="sg-component"><button @click=&q ...

  6. 【进阶玩法】Angular用emit()实现类似Vue.js的v-model双向绑定[(ngModel)]功能

    app.component.html <app-sizer [(ngModel)]="fontSizePx"></app-sizer> <p [sty ...

  7. props写法_简单理解vue中Props属性

    本文实例为大家解析了vue中Props的属性,供大家参考,具体内容如下 使用 Props 传递数据 组件实例的作用域是孤立的.这意味着不能并且不应该在子组件的模板内直接引用父组件的数据.可以使用 pr ...

  8. 【Vue】—数据的双向绑定v-model

    [Vue]-数据的双向绑定v-model

  9. vue生命周期及双向绑定

    这篇文章不是原创,看了其他人的分析贴,记录下自己学到的.本篇主要记录一下vue内部流程,以及双向绑定原理.Vue的可爱之处在于他的双向绑定及Virtual DOM的思想. vue内部流程 如图所示,实 ...

最新文章

  1. 中国功率半导体产业销售规模与投资策略研究报告2022版
  2. HDU 6340 Problem I. Delightful Formulas(伯努利数 + 积性函数反演)
  3. 如何在CLI命令行下运行PHP脚本,同时向PHP脚本传递参数?
  4. stl min函数_std :: min_element()函数以及C ++ STL中的示例
  5. c语言如何制作多线程序,c语言中如何创建多线程。最好有一个例子,谢谢!!...
  6. shell date mysql_shell脚本定时备份mysql数据库
  7. 并发编程大师系列之:CountDownLatch和Join
  8. 内网渗透-域管理员定位
  9. pr中裁剪工具的使用
  10. 大数运算之C 语言大数演算法
  11. 机器学习笔记 - 什么是高斯混合模型(GMM)?
  12. android 怎么绘制圆形,Android编程绘制圆形图片的方法
  13. CDH和CM介绍及搭建
  14. wifi动不动就断开_解决iPad连接wifi网络经常中断(转)
  15. 1790D Matryoshkas
  16. 线性代数 为什么齐次线性方程有非零解的充要条件是系数行列式不等于零?
  17. 软件测试之软件测试的分类上
  18. Android APK 32位和64位 的区别
  19. 一键即可实现图片翻译成中文,多国语言任意选
  20. out了吧,这份最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比,你都没看过?

热门文章

  1. Windows下的磁盘管理(二)
  2. ATT、IBM等公司结成新的物联网网络安全联盟
  3. 两个小技巧,马上加快上网速度
  4. 有感于“政府傍大款”----谈中小企业融资问题
  5. 揭秘:倒卖火车票的惊人黑幕全过程!
  6. 每个人都应该知道的25个大数据术语
  7. msvcr100.dll丢失原因及解决方法
  8. Python网络编程1--笔记
  9. Java8之——简洁优雅的Lambda表达式
  10. python数据类型详解