Vue.js day5(2019.5.22)

一、生命周期

参考网址:https://cn.vuejs.org/v2/guide/instance.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%9B%BE%E7%A4%BA

二、定义Vue组件

  • 组件基础

参考网址:https://cn.vuejs.org/v2/guide/components.html

* 案例:列表评论
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>列表评论</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        [v-cloak]{
            display:none;
        }
    </style>
</head>
<body>
    <div id="app" v-cloak>
        //调用组件模板
        <discuss @func="flash"></discuss>
        <ul class="list-group">
            <li class="list-group-item" v-for="item in list" :key="item.id">
                <span class="badge">{{item.name}}</span>
                {{item.content}}
            </li>
        </ul>         
    </div>
    //调用组件
    <template id="el">
        <form action="">
            <div class="form-group">
                <label for="author">作者:</label>
                <input type="text" id="author" class="form-control" v-model:value="author">
            </div>
            <div class="form-group">
                <label for="content">内容:</label>
                <textarea name="" id="content" class="form-control" v-model:value="content"></textarea>
            </div>
            <div class="form-group">
                <input type="button" class="form-control btn-primary" @click="add" value="发表">
            </div>
        </form>
    </template>
    <script src="./js/vue.js"></script>
    <script type="text/javascript">
    new Vue({
        el:"#app",
        data:{
            list:[],
        },
        //localstorage实现本地存储的方法
        methods:{
            flash(){
                this.list=JSON.parse(localStorage.getItem('discuss-list') || '[]');
            }
        },
       // components创建一个局部组件
        components:{
             //创建一个组件的模板
            discuss:{
            //template设置一个组建
                template:'#el',
                //data必须是一个函数return返回的必须是一个对象
                data(){
                    return{
                        author:'',
                        content:'',
                    };
                },
                methods:{
                    add(){
                        let list =JSON.parse(localStorage.getItem('discuss-list') || '[]');
                        list.push({id:Math.random(100),name:this.author,content:this.content});
                        localStorage.setItem('discuss-list',JSON.stringify(list));
                        this.author=this.content='';
                        this.$emit('func');
                    }
                }
            }
        },
        created:function(){
            this.flash();
        },
    });
    </script>
</body>
</html>
* 父组件与子组件相互调用复习案例:
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
</head>
<body>
<div id="app" v-cloak>
    {{msg}}
    <ccom v-bind:qian="msg" v-on:func="call"></ccom>
</div>
<template id="el">
    <div>
        <h1>这里是内部组件</h1>
        <button v-on:click="say">点击触发VUE实例中的方法</button>
        <p>{{qian}}</p>
    </div>
</template>
<script src="../js/vue.js"></script>
<script type="text/javascript">
//创建一个全局组件
Vue.component('viw',{
    template:"<h1>这是全局组件</h1>",
    //data 必须是一个函数,返回值必须是一个对象
    data(){
        return {};
    }
});
new Vue({
    el:"#app",
    data:{
        msg:"我有200块钱,儿子 你想要吗?",
        money:''
    },
    components:{
        ccom:{
            template:"#el",
            data(){
                return {
                    msg:"爸爸 给你10块钱去挥霍吧"
                };
            },
            props:['qian'],//父组件调用子组件----->先在全局标签内绑定一个函数,再在js局部组件中使用props调用,
                                 /*
                                 //这里使用pros接受的数据的名称与组件传递的时候绑定的名称是一模一样的
                                 */
            methods:{//子组件传向父组件----->先在组件标签里绑定一个函数,再在js局部组件中使用$emit调用,
                say(){
                    //对于父组件传递的方法而言,其实并不是将这个方法传递给子组件,而是要求子组件将这个方法进行触发.
                    //$emit 函数触发的函数如果是需要传递参数,那么按照参数的顺序从第二个参数开始进行传递
                    this.$emit('func',this.msg);
                }
            }
        }
    },
    methods:{
        call(i){
            // console.log(i)
            this.money = i;
        }
    }
});
</script>
</body>
</html>

三、插槽

参考网址:https://cn.vuejs.org/v2/guide/components-slots.html

1、Vue中插槽的作用和使用方法

参考网址:https://blog.csdn.net/willard_cui/article/details/82469114

定义一个名child子组件,为该子组件添加内容应该在子组件的template中定义,直接在父组件的<child>标签中定义的内容不会被渲染,

<div id="root">
        <child>
            需要插槽才能渲染的内容
            <p>Dell</p>
            <p>Lee</p>
        </child>
    </div>
    <script>
       
 Vue.component('child',{
            template: `<div>
                            <p>这是子组件中正常渲染的内容</p>
                            <slot></slot>
                         </div>`
            }
        )
        var vm=new Vue({
            el:'#root'
        })
    </script>
image.png

2、插槽默认内容

插槽可以提供一个默认内容,如果如果父组件没有为这个插槽提供了内容,会显示默认的内容。如果父组件为这个插槽提供了内容,则默认的内容会被替换掉

父组件提供插槽内容   
 <div id="root">
        <child>
           <p>Hello</p>
        </child>
    </div>
    <script>
        Vue.component('child',{
            template:'<div><slot>defalut value</slot></div>
            }
        )
        var vm=new Vue({
            el:'#root'
        })
    </script>
image.png

3、具名插槽

当需要多个插槽时,可以使用<slot>的特性:name。这个特性可以用来定义额外的插槽。

<div id="root">
        <child>
            <header slot="header">header</header>
            <footer slot="footer">footer</footer>
        </child>
    </div>
    <script>
        Vue.component('child',{
            template:`<div>
                            <slot name="header">default header</slot>
                            <div>content</div>
                            <slot name="footer">default footer</slot>
                        </div>`
            }
        )
        var vm=new Vue({
            el:'#root'
        })
    </script>
image.png

4、作用域插槽

可以先看一个例子,以便更好的理解作用域插槽的作用

在子组件中使用v-for创建一个列表循环,然后在父组件中通过子组件标签child调用,

<div id="root">
        <child></child>
        <child></child>
    </div>
    <script>
        Vue.component('child',{
            data: function(){
                return {
                    list:[1,2,3,4]
                }
            },
            template: '<div><ul><li v-for="value in list">{{value}}</li></ul></div>',
        })
        var vm=new Vue({
            el: '#root'
        })
    </script>
image.png

调用了两次child组件,因为调用的是同一个子组件,所以显示的内容完全一样。如何在每次调用时能有各自的渲染效果?这就是作用域插槽的用武之地。

作用域插槽就是父组件在调用子组件的时候给子组件传了一个插槽,这个插槽为作用域插槽,该插槽必须放在template标签里面,同时声明从子组件接收的数据放在一个自定义属性内,并定义该数据的渲染方式。通过下列展示作用域插槽的使用方式:

<div id="root">
        <child>
            <template slot-scope="props"><!--定义一个插槽,该插槽必须放在template标签内-->
                <li>{{props.value}}</li><--!定义使用渲染方式-->
            </template>
        </child>
        <child>
            <template slot-scope="props">
                <h1>{{props.value}}</h1><!--定义不同的渲染方式-->
            </template>
        </child>
    </div>
    <script>
        Vue.component('child',{
            data: function(){
                return {
                    list:[1,2,3,4]
                }
            },
            template: `<div>
                            <ul>
                                <slot v-for="value in list" :value=value>//使用slot占位
                                </slot>
                            </ul>
                        </div>`
        })
        var vm=new Vue({
            el: '#root'
        })
    </script>
image.png
* 插槽案例:
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
</head>
<body>
<div id="app" v-cloak>
    <com>
        <!-- 插槽机制也能够帮助我们实现数据的传递,只是这种传递是停留在视图层的,并没有进入到代码层 -->
        here is the best place!---{{pm}}
    </com>
</div>
<template id="el">
    <div>
        <h1>这里是组件</h1>
        {{msg}}
        <slot></slot>
    </div>
</template>
<script src="../js/vue.js"></script>
<script type="text/javascript">
new Vue({
    el:"#app",
    data:{
        pm:'my name is  pm'
    },
    components:{
        com:{
            template:"#el",
            data(){
                return {
                    msg:"这是组件数据"
                };
            }
        }
    }
});
</script>
</body>
</html>

四、路由

参考网址https://cn.vuejs.org/v2/guide/routing.html

什么是路由?

  • 我们认识的路由:
    进入到网站的根目录,然后根据文件夹的名称或者文件名去找到对应的文件,然后运行
后端的路由

指网络上的某一个资源URL
后端框架的出现,以及安全性的考虑,后端一般做单一的入口
例如:http://localhost/vue_api/index.php?m=api&a=getlist
单一的入口是指在这个入口文件中,通过路由参数的方式(m=api&a=getlist)将请求分发给不同的资源或者文件处理

前端路由

锚点实现的路由
前端的路由是不会发生页面的刷新或者页面的重启请求的
hash值的变化是不会造成页面重新请求的

* 路由案例:登录注册
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        
        <style>
        /* mint-active */
            .router-link-active{
                background: #00FFFF;
                color:lightseagreen;
                font-size: 20px;
            }
            .v-enter,
            .v-leave-to{
                opacity: 0;
                transform: translateX(200px);
            }
            .v-enter-active,
            .v-leave-active{
                transition: all 1s ease;
            }
        </style>
    </head>
    <body>
        <div id="app" v-cloak>
            <!-- 使用router-link的标签实现路由的连接 -->
            <router-link to="/login" tag="span">登录</router-link>
            <router-link to="/register" tag="span">注册</router-link>
            <!-- <router-link to="/guanggai" tag="span">逛街</router-link> -->
            <!-- <a href="#/login">登录</a>
            <a href="#/register">注册</a> -->
            <transition mode="out-in">
                <router-view></router-view>
            </transition>
        </div>
        <script src="../lib/vue.js"></script>
        <script src="../lib/vue-router.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
        const login = {
                    template:`
                    <div>
                    这是登录组件
                    </div>
                    `,
                };
        const register = {
                    template:`
                    <div>
                    这是注册组件
                    </div>
                    `,
                }
        
        new Vue({
            el:"#app",
            data:{
            },
            components:{
                guanggai:{
                    template:'<div>这是逛街</div>'
                }
            },
            //路由规则
            router: new VueRouter({
                routes:[
                    //redirect重定向,将符合规则的路由发送到指定的路由
                    {path:'/',redirect:'/login'},
                    {path:'/login',component:login},
                    {path:'/register',component:register},
                    // {path:'/guanggai',component:guanggai}
                ],
                linkActiveClass:'is_selected'
            })
        
        });
        </script>
    </body>
</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1. 导语 承接上文:Vue 2.x 实战之后台管理系统开发(一) 在上一篇文章中,我详细叙述了如何创建项目框架和...
    AlessiaLi阅读 4,140评论 4 22
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,198评论 0 6
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 3,311评论 0 3
  • Vue起步 Axios:ajax数据的获取。Vue Router:多页面之间的路由。Vuex:各个组件之间的数据共...
    db366da20578阅读 971评论 0 1
  • 七、分析 (碧玫) 我们中午去酒店餐厅吃了一餐,然后去逛了丘伦顿的华人街,找了一家咖啡馆。我写了一段笔记,收起本子...
    碧玫阅读 259评论 2 4