vue中 关于$emit的用法 子控件与父控件(二)

版权声明:独学而无友,则孤陋寡闻。q群582951247 https://blog.csdn.net/mp624183768/article/details/88126344

1、父组件可以使用 props 把数据传给子组件。
2、子组件可以使用 $emit 触发父组件的自定义事件。

vm.$emit( event, arg ) //触发当前实例上的事件

vm.$on( event, fn );//监听event事件后运行 fn; 

例如:子组件:
 

<template>
  <div class="train-city">
    <h3>父组件传给子组件的toCity:{{sendData}}</h3> 
    <br/><button @click='select(`大连`)'>点击此处将‘大连’发射给父组件</button>
  </div>
</template>
<script>
  export default {
    name:'trainCity',
    props:['sendData'], // 用来接收父组件传给子组件的数据
    methods:{
      select(val) {
        let data = {
          cityname: val
        };
        this.$emit('showCityName',data);//select事件触发后,自动触发showCityName事件
      }
    }
  }
</script>

父组件:

<template>
    <div>
        <div>父组件的toCity{{toCity}}</div>
        <train-city @showCityName="updateCity" :sendData="toCity"></train-city>
    </div>
<template>
<script>
  import TrainCity from "./train-city";
  export default {
    name:'index',
    components: {TrainCity},
    data () {
      return {
        toCity:"北京"
      }
    },
    methods:{
      updateCity(data){//触发子组件城市选择-选择城市的事件
        this.toCity = data.cityname;//改变了父组件的值
        console.log('toCity:'+this.toCity)
      }
    }
  }
</script>

图一:点击之前的数据

图二:点击之后的数据

再来一个完整的案例

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/4.2.0/normalize.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #app {
            margin: 1em;
            font-size: 1.5em;
        }
    </style>
</head>
<body>
<div id="app">
    <p>Parent:{{message}} <input type="text" v-model="message"></p>
    <hr>
    <p>Child:
        <my-component :parent-message="message"></my-component>
    </p>


</div>
<script>
    Vue.component('my-component', {
        template: '    <span>{{parentMessage}}\n' +
        '    <input type="text" v-model="message">\n' +
        '        <button @click="updateText">Update</button>\n' +
        '    </span>',
        props: {'parentMessage': String},
        data() {
            return {
                message: this.parentMessage
            }
        },
        methods: {
            updateText() {
                this.$parent.$emit('update', this.message);
            }
        }
    });
    //
    new Vue({
        el: '#app',
        data: {
            message: 'hello'
        },
        methods: {
            selfUpdate(val) {
                this.message=val;
            }
        },
        mounted(){
            this.$on('update',this.selfUpdate);
        }
    });
</script>
</body>
</html>

那么问题来了 这就是完美的解决方案么

其实不是的。这样会影响很多节点。最完美的方式是使用event bus

下文再接着处理

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/88126344