Vue2实现组件props双向绑定

Vue2的组件props通信方式

这里写图片描述

  • 关于这一点的修改官方给的解释:

    prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。这是为了防止子组件无意修改了父组件的状态——这会让应用的数据流难以理解。
    

    虽然废弃了props的双向绑定对于整个项目整体而言是有利且正确的,但是在某些时候我们确实需要从组件内部修改props的需求

这里写图片描述

联动组件代码:

<template>
<!-- self 只是作用在当前的元素上,子元素不出发该函数 -->
  <div class="pick-bg" v-show="childselectArea" @click.self="cancelClick">
    <div class="pick-com">
      <div class="dp-header">
        <div class="dp-item dp-left vux-datetime-cancel" data-role="cancel" @click="cancelClick">取消</div>
        <!-- stop 阻止事件的冒泡 -->
        <div class="dp-item dp-right vux-datetime-confirm" data-role="confirm" @click.stop="sureClick">确定</div>
      </div>
      <picker :data='addressList' :fixed-columns="columns"  :columns="3" v-model='selectAddList' @on-change='change' ref="picker"></picker>
    </div>
  </div>
</template>

<script>
import { Picker } from 'vux'
import { mapState } from 'vuex'
import gzw from '@/modules/gzw'
export default {
  components: {
    Picker
  },
  data() {
    return {
      selectAddList: [],
      resultObj: {},
      childselectArea: this.selectArea // ①创建props属性result的副本--myResult
    }
  },
  props: ['selectArea','columns'],
  created() {
    this.$store.dispatch('gzw/getAddressList')
  },
  computed: {
    ...mapState({
      addressList: state => state.gzw.addresList,
    })
  },
  watch: {
    selectArea(val) { // ②监听外部对props属性result的变更,并同步到组件内的data属性myResult中
      this.childselectArea = val
    },
    childselectArea(val) {
      this.$emit("on-result-change", {state: val, result: this.resultObj});//③组件内对myResult变更后向外部发送事件通知
    }
  },
  methods: {
    change(value) {
      // console.log('获取的value的值', value)
      // console.log(this.$refs.picker.getNameValues() + '获取的name')
    },
    cancelClick(event) {
      this.childselectArea = !this.childselectArea
    },
    sureClick() {
      this.resultObj = {'name': this.$refs.picker.getNameValues(), 'code': this.selectAddList}
      this.childselectArea = !this.childselectArea
    }
  }
}
</script>

<style>
.pick-bg {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  background-color: rgba(0, 0, 0, 0.4);
}

.pick-com {
  position: absolute;
  bottom: 0;
  width: 100%;
}

.dp-header {
  height: 40px;
  line-height: 40px;
  background-color: #fff;
}

.dp-item {
  width: 60px;
  text-align: center;
  color: #828282;
}

.dp-item:active {
  color: #298;
  background-color: '';
}

.dp-left {
  float: left;
}

.dp-right {
  float: right;
}
</style>

外部调用:

<div class="map">
    地图导航

    <cell title="地区" :value="value" @click.native="selectAddressClick" is-link></cell>
    <coustomer-pick :selectArea="selectAreaAAAA"  @on-result-change="onResultChange"></coustomer-pick>

  </div>


methods: {
    selectAddressClick() { // 选择地区事件
      this.selectAreaAAAA = !this.selectAreaAAAA
    },
    onResultChange(val) {
      console.log('子组件改变之后通知父组件' + JSON.stringify(val))
      this.selectAreaAAAA = val.state
      this.value = val.result.name;
      console.log(val.result.code)
    }
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,实现父子组件数据双向绑定可以通过props和$emit来实现。下面是一种常见的实现方式: 1. 在父组件中,通过props将数据传递给子组件。在子组件中,通过props接收父组件传递的数据。 2. 在子组件中,通过在子组件的data选项中定义一个与props同名的属性,用于接收父组件传递的数据。 3. 在子组件中,通过在模板中使用v-model指令将子组件的属性与父组件的数据进行绑定。这样,当子组件的属性发生变化时,父组件的数据也会相应地更新。 4. 在子组件中,通过使用$emit方法触发一个自定义事件,并将子组件的属性作为参数传递给父组件。 5. 在父组件中,通过在子组件标签上监听自定义事件,并在事件处理函数中更新父组件的数据。 下面是一个示例代码: ```html <!-- 父组件 --> <template> <div> <p>父组件数据:{{ parentData }}</p> <child-component v-model="parentData"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentData: '' }; } }; </script> <!-- 子组件 --> <template> <div> <input type="text" v-model="childData"> <button @click="updateParentData">更新父组件数据</button> </div> </template> <script> export default { props: ['value'], data() { return { childData: this.value }; }, methods: { updateParentData() { this.$emit('input', this.childData); } } }; </script> ``` 在上述示例中,父组件通过v-model将parentData与子组件的属性进行双向绑定。当子组件的输入框内容发生变化时,父组件的parentData也会相应地更新。而当点击子组件的按钮时,子组件会通过$emit方法触发一个名为input的自定义事件,并将子组件的属性childData作为参数传递给父组件。父组件通过监听该自定义事件,并在事件处理函数中更新parentData,从而实现了父子组件数据的双向绑定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值