我们知道,父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,应该怎样做?那就是自定义事件!
使用 v-on 绑定自定义事件
每个 Vue 实例都实现了事件接口 (Events interface),即:

使用 $on(eventName) 监听事件

使用 $emit(eventName) 触发事件

这是来自官方文档的api说明

子组件要触发父级作用域(父组件)的methods 里面的函数方法??

即,在子组件上,绑定自定义方法.如: v-on:kiss = “kissEvent”

这里的kiss,就是事件名,kissEvent 就是父级中的函数名

<div id="app" data-col="kfds">
    <h2>{{name}}</h2>
    <input type="text" v-model="name">

    <test-com :name="name" v-on:kiss="kissEvent"></test-com>
    <test-com></test-com>
    <test-com></test-com>
</div>

然后在component组件中,采用$emit 择机触发:

Vue.component('test-com',{
        template : '<div><div class="kiss" @click="runtip">{{ifcc}}</div><p @click="news(name)">{{name}}</p></div>',
        props : {
            name : String
        },
        data () {
            return {
                ifcc : 1
            }
        },
        methods:{
            runtip () {
                this.ifcc++
            },
            news(v){
                this.$emit('kiss')
            }
        },
        computed : {
            ifcce () {
                return this.name + this.ifcc
            }
        }
    });

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue-api</title>
    <script src="vue.js"></script>
    <style>
        span {margin: 0 10px;display: inline-block; width: 120px; line-height: 1.5;color: #666}
        .kiss{
            display: inline-block;
            background: #ddd;
            border: 1px solid #ccc;
            padding: 5px 15px;
        }
    </style>
</head>
<body>
<h1>vue - api</h1>
<div id="app" data-col="kfds">
    <h2>{{name}}</h2>
    <input type="text" v-model="name">

    <ul>
        <li v-for="it of list">
            <span>code:{{it.code}}</span>
            <span>name:{{it.name}}</span>
            <span>selected:{{it.selected}}</span>
        </li>
    </ul>

    <test-com :name="name" v-on:kiss="kissEvent"></test-com>
    <test-com></test-com>
    <test-com></test-com>
</div>
<script>
    Vue.component('test-com',{
        template : '<div><div class="kiss" @click="runtip">{{ifcc}}</div><p @click="news(name)">{{name}}</p></div>',
        props : {
            name : String
        },
        data () {
            return {
                ifcc : 1
            }
        },
        methods:{
            runtip () {
                this.ifcc++
            },
            news(v){
                this.$emit('kiss')
            }
        },
        computed : {
            ifcce () {
                return this.name + this.ifcc
            }
        }
    });


    const app = new Vue({
        data : {
          name : "粮草",
          list : "",
        },

        watch : {
            name : function (val,old) {
//                console.log("watch hook",val,old)
            },
            list : function (val) {
//                console.log("watch list",val)
            }
        },

        methods : {
            add : function () {
                console.log("事件配置:add事件")
            },
            fetchData () {
                var self = this;
                var xhr = new XMLHttpRequest();
                xhr.open('get','http://10.148.60.223/api/account/preferences/lang');
                xhr.onreadystatechange = function () {
                    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200){
                        console.log(xhr)
                        self.list = JSON.parse(xhr.responseText)
                    }
                };
                xhr.send();
            },

            kissEvent () {
                console.log("fdsfdsfds")
            }
        },


        /**
         * vue 钩子
         * --------------------------------------------------------------------------------------
         */

        //钩子,在  data数据挂载到this根节点上之前,以及methods所有方法挂载到实例根节点之前
        beforeCreate () {
            console.log("1.beforceCreate hook");

            try {
                console.log(this.name);         //测试undefined
                this.add();                     //this.add is not a function
            }catch (e){
                console.log(e)
            }

        },

        //created 钩子  data,methods里面的这些events挂载完成,并且vue内容event,都初始化完成
        created () {

            console.log("2.created hook");
            console.log(this)
            try {
                console.log(this.name);         //测试undefined
                this.add();                     //this.add is not a function
                this.fetchData();
            }catch (e){
                console.error(e)
            }

        },

        //beforeMount 钩子,开始挂载已经编译完成的html,到对应的dom节点时触发的钩子函数, 而html还没有渲染到dom中,只是准备开始渲染了
        beforeMount() {
            console.log("3.beforeMount hook");
        },

        //mounted 钩子, 模板或者html编译完成,且渲染到dom中完成,可以做一些xhr数据, 在整个vue的生命周期中只执行一次
        //在发送xhr后回调操作 不依赖dom的,推荐把xhr放到created生命中
        mounted () {
            console.log("4.mounted hook");
        },

        //数据发生变化后,更新之前
        beforeUpdate () {
            console.log("5.beforeUpdate hook")
        },

        //数据发生变化后,更新视图完成后
        updated () {
            console.log("6.updated hook");
            var self = this;

        },

        //实例销毁前
        beforeDestroy () {
            console.log("7.beforeDestroy hook")
        },

        //实例销毁后
        destroyed(){
            console.log("8.destroyed hook")
            console.log(this)
        }

    });

    app.$mount('#app');

</script>
</body>
</html>
Logo

前往低代码交流专区

更多推荐