Vue组件之全局组件与局部组件

组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。个人认为就是一个可以重复利用的结构层代码片段。

全局组件注册方式: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>

显示结果:

全局组件和局部组件一样,data也必须是一个函数:

<body>
<div id="app1">
    <my-component></my-component>
</div>
<script>
    Vue.component("my-component",{
        template:"<button @click=‘add1‘>全局组件:{{m1}}</button>",
        data:function(){
            return {
                m1:10
            }
        },
        methods:{
            add1:function(){
                this.m1++
            }
        }
    });
    new Vue({
        el:"#app1"
    })
</script>
</body>

显示结果:

当使用 DOM 作为模板时 (例如,将 el 选项挂载到一个已存在的元素上),你会受到 HTML 的一些限制,因为 Vue 只有在浏览器解析和标准化 HTML 后才能获取模板内容。尤其像这些元素 <ul>,<ol>,<table>,<select> 限制了能被它包裹的元素,而一些像<option> 这样的元素只能出现在某些其它元素内部。

自定义组件 <my-row> 被认为是无效的内容,因此在渲染的时候会导致错误。变通的方案是使用特殊的 is 属性:

eg:

<body>
<div id="app1">
<ul>
    <li is="my-component"></li>
</ul>
</div>
<script>
 Vue.component("my-component",{
     template:"<h1>{{message}}</h1>",
     data:function(){
         return {
             message:"hello world"
         }
     }
 });
 new Vue({
     el:"#app1"
 })
</script>
</body>

渲染结果为:

对于全局与局部的作用域问题,我们可以这样理解,只要变量是在组件内部用的,这些变量必须是组件内部的,而在外部html结构中引用的变量,都引用的是该挂载下的实例里面的变量

eg:

<body>
<div id="app1">
<my-component></my-component>
</div>
<script>
 Vue.component("my-component",{
     template:"<button @click=‘add3‘>" +
     "{{message}}</button>",
     data:function(){
         return {
             message:"hello world"
         }
     },
     methods:{
         add3:function(){
             alert("我是局部")
         }
     }
 });
 new Vue({
     el:"#app1",
     methods:{
         add3:function(){
             alert("我是全局")
         }
     }
 })
</script>
</body>

弹出框显示:我是局部

Vue中所谓的全局指的是该挂载下的区域;

下面这种做法是错误的,按我的想法觉得应该会弹出:我是全局,但是却报错,也就是说组件处于全局下不可以添加默认事件,要用全局的事件函数,必须父子通信

<body>
<div id="app1">
<my-component @click="add3"></my-component>
</div>
<script>
 Vue.component("my-component",{
     template:"<button @click=‘add3‘>" +
     "{{message}}</button>",
     data:function(){
         return {
             message:"hello world"
         }
     }
 });
 new Vue({
     el:"#app1",
     methods:{
         add3:function(){
             alert("我是全局")
         }
     }
 })
</script>
</body>

额外话题:

1.函数return后面必须跟返回的内容,不能换行写

eg:

下面这种写法不会返值回来:

2.Vue和小程序等一样,采用es6的函数写法,this指向是不一样的

<body>
<div id="app1">
    <button @click="f">ES5</button>
    <button @click="f1">ES6</button>
</div>
<script>
new Vue({
    el:"#app1",
    methods:{
        f:function(){
          console.log(this)
        },
        f1:()=>{
            console.log(this)
        }
    }
})
</script>
</body>

结果:

第一个this指的是Vue实例

第二个this指的是Window

由于它和小程序不一样,我发现在data里面this指的是window,在methods里面this才是Vue实例

所以建议大家用es5写吧

new Vue({
    el:"#app1",
    data:{that:this},
})

博文地址:http://www.cnblogs.com/douyae...

原文地址:https://www.cnblogs.com/10yearsmanong/p/12207530.html

时间: 2024-10-23 23:04:43

Vue组件之全局组件与局部组件的相关文章

Vue:全局组件与局部组件

全局组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="seg1"> <alert></alert> </div> <script

VueJS组件之全局组件与局部组件

全局组件 所有实例都能用全局组件. HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>

TZ_16_Vue定义全局组件和局部组件

1.定义全局组件 我们通过Vue的component方法来定义一个全局组件. <div id="app"> <!--使用定义好的全局组件--> <counter></counter> </div> <script src="./node_modules/vue/dist/vue.js"></script> <script type="text/javascript&q

vue的全局组件和局部组件

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>全局组件.局部组件</title> <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script></head><body><div id="a

Vue.js中全局组件和局部组件的编写差异和注意事项

全局组件的编写方式: <div id='app'> <runoob></runoob> </div> <script> Vue.component('runoob',{ template:'<h1>Hello World!</h1>' }) new Vue({ el:'#app', }) </script> 局部组件的编写方式: <div id='app'> <runoob></r

vue 组件 全局注册与局部注册的方法

全局注册 html部分 <div id="e1"><name1></name1></div> script部分 <script type="text/javascript"> Vue.component('name1', { template: '<div>我是效果</div>'})   //定义全局模板        例如 Vue.component(tagName, option

vue.js 组件-全局组件和局部组件

这两天学习了Vue.js 感觉组件这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记. 首先Vue组件的使用有3个步骤,创建组件构造器,注册组件,使用组件3个方面. 代码演示如下: <!DOCTYPE html> <html> <body> <div id="app"> <!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使用组件--> <my-component></my-compo

vue 组件 全局注册和局部注册

全局注册,注册的组件需要在初始化根实例之前注册了组件: 局部注册,通过使用组件实例选项注册,可以使组件仅在另一个组件或者实例的作用域中可用: 全局组件 js Vue.component('tab-title',{ props:['title'], template:'<li v-on:click="$emit(\'change\')">{{title}}</li>' }) Vue.component('tab-content',{ props:['content

vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件

一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3>我是标题3</h3>' }); Vue.component('aaa',Aaa); *组件里面放数据: data必须是函数的形式,函数必须返回一个对象(json) 2. 局部组件 放到某个组件内部 var vm=new Vue({ el:'#box', data:{ bSign:true }, components:{ //局部组件 aaa:Aaa } }); 1

vue.js中的全局组件和局部组件

组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三个步骤: 1.创建组件构造器 2.注册组件 3.使用组件 先来看一段代码: <!DOCTYPE html> <html> <body> <div id="app"> <!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使