Vue的学习笔记-Day4-01(父组件向子组件传值、评论列表、ref的使用)

一、父组件向子组件传值

<div id="app">
    <!--父组件可以在引用子组件的时候,通过属性绑定{v-bind:}的形式,把需要传递给子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用-->
    <com1 :parentmsg="msg "></com1>
</div>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            msg: '父组件的数据'
        },
        methods: {},
        components: {
            //子组件中默认无法访问到父组件中的data上的数据和methods中的方法
            com1: {
                data() {//子组件中的data数据并不是通过父组件传递过来的,而是子组件自身私有的
                    return {
                        title: '123',
                        content: 'qqq'
                    }
                },
                template: '<h1>这是子组件 --- {{parentmsg}}</h1>',
                /*组件中的所有props中的数据,都是通过父组件传递给子组件的*/
                /*props中的数据只是可读的,不可以改变,而data中的数据可读可写*/
                props: ['parentmsg']//把父组件传递过来的parentmsg属性,现在props数组中定义一下,这样才能使用这个数据
            }
        }
    })
</script>

二、父组件把方法传递给子组件同时传值

<div id="app">
    <!--父组件向子组件传递方法,使用的是事件绑定机制 v-on: 当我们自定义了一个事件属性之后,子组件可以通过某些方法来调用传递进去的这个方法-->
    <com2 @func="show"></com2>
</div>

<template id="tmpl">
    <div>
        <h1>这是子组件</h1>
        <input type="button" value="这是子组件中的按钮 - 点击它,触发父组件传递出来的func方法" @click="myClick">
    </div>
</template>

<script>

    var com2 = {
        template: '#tmpl',
        data() {
            return {
                sonmsg: {name: '小头儿子', age: 6}
            }
        },
        methods: {
            myClick() {
                //emit 英文原意是触发的意思
                this.$emit('func', this.sonmsg, 456);
            }
        }
    };


    var vm = new Vue({
        el: '#app',
        data: {
            dataMsgFromSon: null
        },
        methods: {
            show(data, data2) {
                // console.log('调用了父组件身上的show方法---' + data + '---' + data2);
                // console.log(data);
                this.dataMsgFromSon = data;
            }
        },
        components: {
            com2
        }
    })
</script>

三、组件案例-评论列表

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="lib/bootstrap.css">
    <script src="lib/vue-2.6.10.js"></script>
</head>
<body>

<div id="app">

    <cmt-box @func="loadComments"></cmt-box>

    <ul class="list-group">
        <li class="list-group-item" v-for="(item,i) in list" :key="item.i">
            <span class="badge">评论人:{{item.user}}</span>
            {{item.content}}
        </li>
    </ul>

</div>

<template id="tmpl">
    <div>
        <div class="form-group">
            <label>评论人:</label>
            <input type="text" class="form-control" v-model="user">
        </div>

        <div class="form-group">
            <label>评论内容:</label>
            <textarea class="form-control" v-model="content"></textarea>
        </div>

        <div class="form-group">
            <input type="button" value="发表评论" class="btn btn-primary" @click="postComment">
        </div>
    </div>
</template>

<script>
    var commentBox = {
        data() {
            return {
                user: '',
                content: ''
            }
        },
        template: '#tmpl',
        methods: {
            postComment() {//发表评论的方法
                //分析发表评论的业务逻辑
                //1、评论数据存到 localStorage
                //2、先组织一个最新的评论数据对象
                //3、想办法把第二步得到的评论对象保存到localStorage
                //3.1、localStorage只支持存放字符串,要先调用JSON.stringify
                //3.2、在保存最新的评论数据之前,要先从localStorage获取到之前的评论数据,把最新的评论push到这个数组
                //3.3、如果获取到的评论字符串为空或者不存在,则可以返回一个'[]',让JSON.parse去转换
                //3.4、把最新的评论列表数组,再次调用JSON.stringify转换为数组字符串,然后调用localStorage.setItem();

                var comment = {id: Date.now(), user: this.user, content: this.content};

                /*从localStorage中获取的所有评论*/
                var list = JSON.parse(localStorage.getItem('cmts') || '[]');
                list.unshift(comment);
                localStorage.setItem('cmts', JSON.stringify(list));
                this.user = this.content = '';

                this.$emit('func');
            }
        }
    };

    var vm = new Vue({
        el: '#app',
        data: {
            list: []
        },
        created() {
            this.loadComments();
        },
        methods: {
            loadComments() {//从本地的localStorage中加载评论列表
                let list = JSON.parse(localStorage.getItem('cmts') || '[]');
                this.list = list;
            }
        },
        components: {
            'cmt-box': commentBox
        }
    })
</script>

</body>
</html>

四、使用ref获取dom元素和组件

<div id="app">
    <input type="button" value="获取元素" @click="getElement">

    <h3 ref="myh3">哈哈哈,今天天气太好了!</h3>

    <hr>

    <login ref="mylogin"></login>
</div>

<script>

    var login = {
        template: '<h1>登录组件</h1>',
        data() {
            return {
                msg: 'son msg'
            }
        },
        methods: {
            show() {
                console.log('调用了子组件的方法');
            }
        }
    };

    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            getElement() {
                //ref是英文单词reference 引用的意思
                console.log(this.$refs.mylogin.msg);
                this.$refs.mylogin.show();
            }
        },
        components: {
            login
        }
    })
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339