vue中props的双向绑定

在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>
   <MsgModal
      v-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百口桶阶段,才没做两个项目
有不足的地方请人人包涵和指点
迎接人人议论

    原文作者:unique丶J
    原文地址: https://segmentfault.com/a/1190000017400269
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞