您的位置 首页 java

Vue中关于组件传值与事件修饰符sync

在Vue中,父子组件之间是不存在v-model双向绑定的,双向绑定会造成维护上的问题。

在vue中关于父子组件之间传值有几种方式:

1、使用vuex状态管理进行中间存储值的操作;

2、使用自定义事件方式。

vuex在这里不说了,现在来说自定义事件方式。

一、父组件向子组件传递数据

使用prop向子组件传递数据:

a.在子组件中定义一个prop属性: msg

b.在父组件中通过 msg=”value” 来向子组件中传递数据,如果数据为响应式的,使用 v-bind:msg=”msg” (简写为 :msg=”msg”

 //父组件
<template>
  <div id="app">
    <h1>{{msg}}</h1>
    <HelloWorld :msg="msg"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
  data() {
    return {
      msg: '这是父组件', 
    }
  },
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>  
 //子组件
<template>
  <div  style="background-color: aquamarine">
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String,
  }
}
</script>  

二、子组件向父组件传递数据

  • 1、使用自定义修饰事件

a.在父组件中自定义事件名,调用父组件中的方法:@fun=”funParent”

b.子组件中的方法调用自定义事件,并传递参数:this.$emit(‘自定义事件名’,参数1,参数2,参数3…)

c.父组件中的方法接收子组件方法的参数:funParent(参数1,参数2,参数3…)

 <template>
  <div id="app">
    <h1>{{msg}}</h1>
    <button @click="setMsg">父组件按钮</button>
      //a,父组件中自定义事件fun,调用父组件中的方法getChildmsg
    <HelloWorld :msg="msg" @fun="getChildmsg"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
  data() {
    return {
      msg: '这是父组件',  
    }
  },
  methods: {
     //父组件中的方法,将子组件中传递出来的数据设置到msg上
    //getChildmsg(参数1,参数2,参数3...)
    getChildmsg(data) {
      this.msg = data
    },
    setMsg() {
      this.msg = "这是父组件"
    }
  },
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>  
 <template>
  <div class="hello" style="background-color: aquamarine">
    <h1>{{ msg }}</h1>
    <button @click="toParent">子组件按钮</button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String,
  },
  data() {
    return {
      childmsg: "这是子组件"
    }
  },
  methods: {
    //子组件按钮事件方法,调用自定义事件,向外传递数据childmsg
    //this.$emit('自定义事件名',参数1,参数2,参数3...)
    toParent() {
      this.$emit('fun',this.childmsg)
    }
  }
}
</script>  

测试:

  • 2、使用sync修饰符

2.3.0+新增的,作为一个语法糖来使用,简化上面1的步骤

a.修改父组件中的事件名

注, “update:” 前缀一定要完全一致

 <HelloWorld :msg="msg" @update:msga="getChildmsg"/>  

b.子方法中同步修改

 toParent() {
      this.$emit('update:msga',this.childmsg)
    }  

c.将getChildmsg改为匿名方法,并删除getChildmsg方法

 <HelloWorld :msg="msg" @update:msga="function(data) { msg = data}"/>  

d.继续修改

 <HelloWorld :msg="msg" @update:msga="data => msg = data"/>  

e.最终成型

 <HelloWorld :msg="msg" :msga.sync="msg"/>  
  • 3.使用ref属性

将子组件定义一个ref属性

 <HelloWorld :msg="msg" ref="child"/>  

在父方法中调用

 this.msg = this.$refs.child.childmsg  

文章来源:智云一二三科技

文章标题:Vue中关于组件传值与事件修饰符sync

文章地址:https://www.zhihuclub.com/179199.shtml

关于作者: 智云科技

热门文章

网站地图