美文网首页
09、掌握Vue的另一个核心:组件

09、掌握Vue的另一个核心:组件

作者: 小白摘葡萄 | 来源:发表于2020-06-09 17:35 被阅读0次

    实现组件



    我们用传统的实现方式实现一个组件,html 代码如下:
     <div class="unit">
        <div class="content">
            <h1>这里是文章的标题</h1>
            <div class="info">
                <span>2017年4月10日</span>
                <span class="original">原创</span>
            </div>
        </div>
        <img src="../img/cover.jpg" alt="">
     </div>
    

    效果图如下:


    效果图.png

    在 vue 组件中,这些代码将作为我们组件的模板 template。
    接下来我们看看 vue 是如何实现一个组件的。
    首先,我们还是先创建一个 vue 实例。

     <div id="app"></div>
     <script>
        let vm = new Vue({
           el:"#app",
        });
     </script>
    

    成功创建了一个 vue 实例 vm,挂载元素是 id 为 app 的 div 节点。
    接下来,我们在创建实例 vm 之前,利用 vue 提供的 API 来注册一个组件。稍微修改一下上面的代码:

     <div id="app"></div>
     <script>
        Vue.component('my-article',{
           template:`<div>
                    <div>
                    <h1>这里是文章的标题</h1>
                    <div>
                    <span>2017年4月10日</span>
                    <span>原创</span>
                    </div>
                    </div>
                    <img src="../img/cover.jpg" alt="">
                    </div>`
        });
    
        let vm = new Vue({
           el:"#app",
        });
     </script>
    

    我们使用了 vue 提供的全局 API Vue.component(),注册了一个名为:“my-article”的组件,而组件的 template 正好是我们上面的 html 代码,这样,我们就可以用 <my-article></my-article> 的方式来使用我们的组件。

    注意:一定要确保实例 vm 在创建之前,<my-article> 组件已经被成功注册,这也是为什么我们要把代码写在实例化之前。

    既然注册了组件 <my-article>,我们就来使用这个自定义的组件:

     <div id="app">
        <my-article></my-article>
     </div>
    

    效果如下:


    效果图.png

    我们看到最终渲染的不是标签 <my-article></my-article>,而是我们组件的模板 template 的值。我们成功注册了一个自定义的组件并使用了它。
    但这并不够,我们有的文章目录中不仅仅只有一篇文章,而且每篇文章的标题和日期都不一样,我们如何动态地展示它们的数据呢?
    这里就涉及到了组件的传参 props,不但函数可以接受参数,vue 的组件也可以。接下来,我们看看怎么实现传参。
    我们知道,组件中的这4部分是需要动态获取数据的:标题,时间,是否原创,头像。


    效果图.png
    那么,我们就通过传参的方式把这些数据传到组件,实现数据动态展示。
    首先,我们把数据存储在实例vm的data中:
     let vm = new Vue({
       el:"#app",
       data:{
           article:{
               title:"文章标题-1",
               date:" 2017年03月06日",
               is_original:true,
               cover_url:"../img/cover.jpg"
           }
       }
     });
    

    我们给 data 增加了一个文章 article 的信息,包括:标题 title,时间 date,是否原创 is_original,头像 cover_url。
    文章的信息有了,我们怎么传到组件中去呢?

    <div id="app">    
      <my-article :detail="article"></my-article>
    </div>
    

    就像一个函数传参一样,你可以把 detail 理解成一个形参,article 相当于实参。

    Vue.component('my-article',{
       props:['detail'],
       template:`<div>
                <div>
                <h1>{{detail.title}}</h1>
                <div>
                <span>{{detail.date}}</span>
                <span v-show="detail.is_original">原创</span>
                </div>
                </div>
                <img :src="detail.cover_url" alt="">
                </div>`
    });
    

    除了 template 以外,我们增加了 props,通过它来接受我们的参数 detail,传进来之后,你可以在组件的模板 template 中使用它所接受的所有数据了。比如,我们传进来的数据包含着文章的信息:title,date,is_original,cover_url。
    效果如下:


    效果图.png

    数据是动态读取了,那么我们的目录并不仅仅只有一篇文章,当我们数据多了之后,该用什么方式展示出来呢?

    let vm = new Vue({
       el:"#app",
       data:{
           articles:[
               {
                   title:"文章标题-1",
                   date:"2017年03月06日",
                   is_original:true,
                   cover_url:"../img/cover.jpg"
               },
               {
                   title:"文章标题-2",
                   date:" 2017年03月09日",
                   is_original:true,
                   cover_url:"../img/cover.jpg"
               },
               {
                   title:"文章标题-3",
                   date:"2017年03月17日",
                   is_original:true,
                   cover_url:"../img/cover.jpg"
               },
               {
                   title:"文章标题-4",
                   date:"2017年03月20日",
                   is_original:true,
                   cover_url:"../img/cover.jpg"
               },
           ]
       }
     });
    

    articles是一个数组,我们用 v-for 指令对它进行遍历即可。
    我们对html代码稍微改动一下:

     <div id="app">
        <my-article 
                v-for="item in articles" 
                :detail="item">
        </my-article>
     </div>
    

    我们在组件上加上了 v-for 指令,并遍历了 articles。
    渲染结果:


    效果图.png

    相关文章

      网友评论

          本文标题:09、掌握Vue的另一个核心:组件

          本文链接:https://www.haomeiwen.com/subject/dcxetktx.html