欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

零基础学习Vue: 第30课 Vue子组件实现动态文章列表小案例:

程序员文章站 2022-04-24 09:47:35
...

实现后的效果图:

零基础学习Vue: 第30课 Vue子组件实现动态文章列表小案例:

实现代码如下:

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入vue -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- 引入网上bootstrap内写好的css样式 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aaa@qq.com/dist/css/bootstrap.min.css">
    <!-- 点的写一下父组件的样式 -->
    <style>
        *{margin:0;padding:0;}
        #app{
            width:1200px;
            margin:auto;
        }
    </style>
</head>
<body>

<div id="app">
    <!-- 4.引入组件     遍历父组件articles数组数据  v-for遍历组件需加key值      父组件传入type属性 与 sign个性签名数据   -->
    <panel v-for="(article,index) in articles" :key="index" :type="article.type" :sign="article.sign">
    	 <!-- 插入title插槽 -->
        <h3 slot="title">{{article.title}}</h3>
        <!-- 插入content插槽 -->
        <p slot="content" class="panel-body">{{article.content}}</p>
        <!-- 插入author插槽 -->
        <p slot="author" v-if="article.author">作者:{{article.author}}</p>
    </panel>
</div>

<!-- 3.设置子组件panel标签样式 -->
<template id="panel">
    <!-- :class="heaven"设置动态clss属性样式,当子组件panel内heaven属性不同 对应样式也改变 -->
    <div class="panel" :class="heaven">
        <div class="panel-heading">
            <!-- 定义插槽 -->
           <slot name="title"></slot>
        </div>
        <div class="panel-body">
            <!-- 定义插槽 -->
            <slot name="content"></slot>
        </div>
        <div class="panel-footer">
            <!-- 定义插槽 -->
            <slot name="author">
                <p>匿名</p>
            </slot>
        </div>
        <div class="panel-footer">
            <!-- 在子组件设置一个点击事件 -->
            <button class="btn btn-success" @click="fn">查看作者个性签名</button>
        </div>
    </div>

</template>


<script>
    //1.定义子组件panel
    let panel = {
        template:'#panel',
        props:['type','sign'], //获取父组件传过来的数据
        data(){
            return{
                insign:''
            }
        },
        methods:{
            fn(){
                //如果父组件传过来的sign有值则显示,没有则显示默认的个性签名
                this.insign = this.sign? this.sign : '这家伙很懒,什么也没写'
                //this.$el...获取根节点的第二个子节点的内容       this.sign父组件传递过来的数据 
                alert(this.$el.children[2].innerText+'。个性签名:'+this.insign)
            }
        },
        computed:{  //时时监测计算属性缓存
            heaven(){   //一个时时监测的属性heaven
                return 'panel-' + this.type
            }
        }
    }

    let vm = new Vue({
        el:'#app',
        data:{
            //articles数组模拟文章数据
            articles:[
                {type:'success',title:'什么是vue',content:'vue文章',author:'小马',sign:'世界上有两种人,一种努力的,一种不努力的'},
                {type:'warning',title:'什么是react',content:'react文章',author:'小强',sign:'宝剑锋从磨砺出,梅花香自苦寒来!'},
                {type:'danger',title:'什么是js',content:'js文章'}
            ]
        },
        components:{    //2.注册子组件panel
            panel
        }
    })
</script>
</body>
</html>