vue组件

首先呢 先注册组件

全局组件注册方式:Vue.component(组件名,{方法})

eg:

<body>
<div id="app">
<my-component></my-component>
</div>
<div id="app1">
    <my-component></my-component>

</div>
<script>
Vue.component("my-component",{
    template:"<h1>我是全局组件</h1>"
});
new Vue({
    el:"#app"
});
new Vue({
    el:"#app1"
})
</script>
</body>

渲染结果:

<div id="app">
    <h1>我是全局组件</h1>
</div>
<div id="app1">
    <h1>我是全局组件</h1>
</div>

这里需要注意:

1.全局组件必须写在Vue实例创建之前,才在该根元素下面生效;

eg:

<body>
<div id="app">
    <my-component></my-component>
</div>
<div id="app1">
    <my-component></my-component>

</div>
<script>
    new Vue({
        el: "#app"
    });
    Vue.component("my-component", {
        template: "<h1>我是全局组件</h1>"
    });
    new Vue({
        el: "#app1"
    })
</script>
</body>

这样只会渲染app1根元素下面的,并不会渲染app根元素下面的,并且会报错。

2.模板里面第一级只能有一个标签,不能并行;

<body>
<div id="app">
    <my-component></my-component>
</div>
<script>
    new Vue({
        el: "#app"
    });
    Vue.component("my-component", {
        template: "<h1>我是全局组件</h1>" +
        "<p>我是全局组件内标签</p>"
    });
    new Vue({
        el: "#app1"
    })
</script>
</body>

这样子会报错,并且只会渲染第一个标签h1;我们应该这样子写:

<body>
<div id="app">
    <my-component></my-component>
</div>
<script>
    new Vue({
        el: "#app"
    });
    Vue.component("my-component", {
        template: "<h1>我是全局组件<p>" +
        "我是全局组件内标签</p></h1>"
    });
    new Vue({
        el: "#app1"
    })
</script>
</body>

局部组件注册方式,直接在Vue实例里面注册

eg:

<body>
<div id="app1">
    <child-component></child-component>
</div>
<script>
    new Vue({
        el: "#app1",
        components:{
            "child-component":{
                template:"<h1>我是局部组件</h1>"
            }
        }
    });
</script>

局部组件需要注意:

1.属性名为components,s千万别忘了;

2.套路比较深,所以建议模板定义在一个全局变量里,代码看起来容易一点,如下:(模板标签比较多的时候,这样子写更加简洁规整)

<body>
<div id="app1">
    <child-component></child-component>
</div>
<script>
    var child={
        template:"<h1>我是局部组件</h1>"
    };
    new Vue({
        el: "#app1",
        components:{
            "child-component":child
        }
    });
</script>
</body>

关于组件中的其他属性,可以和实例中的一样,但是data属性必须是一个函数:

eg:

<body>
<div id="app1">
    <child-component></child-component>
</div>
<script>
    var child={
        template:"<button @click='add2'>我是局部组件:{{m2}}</button>",
        data:function(){
            return {m2:1}
        },
        methods:{
            add2:function(){
                this.m2++
            }
        }
    };
    new Vue({
        el: "#app1",
        components:{
            "child-component":child
        }
    })
</script>
</body>

显示结果:

image.png

组件之间传值有三种方式
1、父传子
2、子传父
3、利用时间总线

子传父

<div id="app">
        <h5>当前的计数值为:{{childData}}{{cheran}}</h5>
        <c @countadd="coundH" step="3" msg="点击"></c>
        <c @countadd="coundH" step="2" msg="你好"></c>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        //组件之间传值  子传父  通过事件派发$emit
        //在vue中使用$emit实现事件派发
        //父组件向子组件传值,通过props传递
        var counter = {
            template: `<button @click="plusHandle">step{{step}}当前值为:{{count}}{{dd}}</button>`,
            data() {
                return {
                    count: 0,
                    dd: "",
                };
            },
            props: ['step', "msg"],
            methods: {
                plusHandle() {
                    //alert(this.step);
                    //alert(this.msg);
                    this.count += this.step * 1;
                    //参数一表示事件名字
                    this.dd = this.msg;
                    //参数二表示传递参数
                    this.$emit("countadd", this.count, this.dd)
                },
            },
        };
        var app = new Vue({
            el: "#app",
            data: {
                childData: 0,
                cheran: "",
            },
            components: {
                c: counter,
            },
            methods: {
                coundH(v, a) {
                    console.log(v)
                    console.log(a)
                    this.childData = v;
                    this.cheran = a;
                }
            }
        });
    </script>

父传子

<div id="app">
        <h5>我是用来获取子组件的值的{{strchild}}----{{ds}}</h5>
        <inp @chuanzhi="chuanzhihandle" msg="你好呀"></inp>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        Vue.component("inp", {
            template: `<div>
        <input @keyup.enter="chuanzhi" v-model="txt" placeholder="请输入内容" />
        </div>`,
            data() {
                return {
                    txt: "",
                    ds: "",
                };
            },
            props: ["msg"],
            methods: {
                chuanzhi() {
                    // alert(this.txt);
                    this.ds = this.msg;
                    this.$emit("chuanzhi", this.txt, this.ds);
                },
            },

        })
        var app = new Vue({
            el: "#app",
            data: {
                strchild: "",
                ds: "",
            },
            methods: {
                chuanzhihandle(str, ds) {
                    this.strchild = str;
                    this.ds = ds;
                }
            },
        });
    </script>

事件总线

用来解决非相关组件之间的传值
使用一个空白的对象单独用来做事件的派发和监听
在vue中通过on监听事件,通过emit派发
非父子组件之间传值,需要定义个公共的公共实例文件bus.js,作为中间仓库来传值,不然路由组件之间达不到传值的效果。

公共bus.js

//bus.js
import Vue from 'vue'
export default new Vue()

组件A:

<template>
  <div>
    A组件:
    <span>{{elementValue}}</span>
    <input type="button" value="点击触发" @click="elementByValue">
  </div>
</template>
<script>
  // 引入公共的bug,来做为中间传达的工具
  import Bus from './bus.js'
  export default {
    data () {
      return {
        elementValue: 4
      }
    },
    methods: {
      elementByValue: function () {
        Bus.$emit('val', this.elementValue)
      }
    }
  }
</script>

组件B:

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

推荐阅读更多精彩内容

  • 一、什么是组件(Component)? 组件(Component)是Vue.js最强大的功能之一。组件可以扩展HT...
    廖马儿阅读 24,222评论 1 4
  • 此文基于官方文档,里面部分例子有改动,加上了一些自己的理解 什么是组件? 组件(Component)是 Vue.j...
    陆志均阅读 3,795评论 5 14
  • 什么是Vue组件 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,...
    bacbcc94613b阅读 957评论 0 0
  • 推荐我的vue教程:VUE系列教程目录 上篇讲解了vue-router路由入门,现在讲讲关于vue组件的内容。如果...
    侬姝沁儿阅读 2,354评论 6 20
  • 2018年5月8日星期二心情开心 欣赏自己:今天是特种兵训练第二周结束了!我很佩服自己可以坚持下去,在店里忙生意的...
    f64074bfc715阅读 133评论 0 0