六、vue的另一个核心:组件

vue有两大核心:<strong>数据驱动</strong>和<strong>组件</strong>。
<strong>组件</strong>是人为地把页面合理地拆分成一个个区块,让这些区块更方便重复使用,有了组件,可以更高效合理地开发和维护项目。

一、规划组件

规划组件

上图中 <b>橙色框框区块</b>看作一个组件来进行规划,这样就方便复用这个组件;

二、规划组件

用传统的实现方式一个组件,html代码如下:

<div class="rbzzx_sale_end_con">
    <div>
        <span class="rbzzx_sale_end_con_img"><a href="javascript:;">< img src="images/armed_app45.png" /></a></span>
        <div class="rbzzx_sale_end_con_txt">
            <h5><a href="javascript:;">精选牛肉精选牛肉精选牛肉</a></h5>
            <p class="p1">特卖价:<b>¥56800</b></p>
            <p class="p2">原价:¥76000</p>
            <a href="javascript:;" class="rbzzx_sale_end_btn">
                <cite>即将开始</cite>
                <input type="button" />
            </a>
        </div>
    </div>
</div>

<strong>释:</strong> class为unit的<div>容器以及它的子孙节点组成了组件。在vue组件中,这些代码将作为组件的模板template。

看看vue如何实现一个组件的:

1、先创建一个vue实例:
<div id="app"></div>
<script>
   new Vue({
       el:"#app",
    });
</script>

<strong>释:</strong> 成功创建了一个vue实例vm,挂载元素为id为app的div节点。

2、在创建实例vm之前,利用vue提供的API来注册一个组件。修改一下上面的代码:
<div id="app">
   <my-list></my-list>
</div>
<script>
    Vue.component('my-list',{
        template:`
        <div>
          <span><a>< img src="../images/bird1.png" /></a></span>
          <div>
            <h5><a>精选牛肉精选牛肉精选牛肉</a></h5>
            <p>特卖价:<b>¥56800</b></p>
            <p><a>原价:¥76000</a></p>
            <cite>已结束</cite>
          </div>
      </div>`
    });

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

<strong>释:</strong>使用了vue提供的全局API Vue.component() ,注册了一个名为:“my-list”的组件,而组件的template正好是我们上面的html代码,这样,我们就可以用 <my-list></ my-list> 的方式来使用我们的组件。
<strong>注:</strong>注意:一定要确保实例vm在创建之前, <my-list> 组件已经被成功注册,这也是为什么我们要把代码写在实例化之前。

3、注册了组件 <my-article> ,使用这个自定义的组件:
<div id="app">
    <my-list></my-list>
</div>
自定义组件

<strong>释:</strong>看到最终渲染的不是标签<my-list><my-list>,而是组件的模板template的值。表示成功地注册一个自定义的组件并使用它。

4、怎么实现传参?

每件拍品的图片、标题、价格、状态都不一样,如何动态地展示它们的数据呢?涉及到了组件的传参props,不但函数可以接受参数,vue的组件也可以。

(1) 把数据存储在实例vm的data中:
new Vue({
  el:"#app",
  data:{
    akm_pp:
      {
       img_url:"../images/bird1.png",
       title:"精选牛肉精选牛肉精选牛肉",
       sale_price:"¥56800",
       org_price:"原价:¥76000",
       state:"立即购买",
       ended:false,
      }
})
(2) 信息有了,传到组件中:
<div id="app">
    <my-list :detail="akm_pp"></my-list>
</div>

<strong>释:</strong>就像一个函数传参一样,把detail理解成一个形参,akm_pp相当于实参。

把注册组件的代码稍微修改一下:

Vue.component('my-list',{
  props:['detail'],
  template:`
    <div style="margin-top:10px;">
      <span><a>< img src="detail.img_url" /></a></span>
      <div>
        <h5><a>{{detail.title}}</a></h5>
        <p>特卖价:<b>{{detail.sale_price}}</b></p>
        <p><a>{{detail.org_price}}</a></p>
        <cite>{{detail.state}}</cite>
     </div>
   </div>`
});

<strong>释:</strong>除了template以外,增加了props,通过它来接受参数detail,传进来之后,可以在组件的模板template中使用它所接受的所有数据了。


传入数据
(3) 数据多了之后,使用 v-for 指令,它是专门用于处理列表渲染的指令;
new Vue({
  el:"#app",
  data:{
  amk_list:[
            {
                img_url:"../images/bird1.png",
                title:"精选牛肉精选牛肉精选牛肉",
                sale_price:"¥56800",
                org_price:"原价:¥76000",
                state:"立即购买",
                ended:false,
            },
            {
                img_url:"../images/bird2.png",
                title:"hiddensmile",
                sale_price:"¥123200",
                org_price:"原价:¥200000",
                state:"已结束",
                ended:true,
            },
            {
                img_url:"../images/bird3.png",
                title:"澳洲进口书画澳洲进口书画澳洲进口书画",
                sale_price:"¥666666",
                org_price:"原价:¥888888",
                state:"立即购买",
                ended:false,
            },
            {
                img_url:"../images/bird4.png",
                title:"倪萍的画倪萍的画倪萍的画",
                sale_price:"¥1314",
                org_price:"原价:¥520",
                state:"已结束",
                ended:true,
            },
        ]
    }
});

<strong>注:</strong>组件已经封装好,只需要给它传参即可,所以不需要改动组件的代码。而amk_list是一个数组,用 v-for 指令对它进行遍历即可。

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

推荐阅读更多精彩内容