vue之组件

140 阅读3分钟

初识组件应用

实例化多个vue对象

用new创建多个vue对象并命名,可以通过变量相互访问
例子:对象2修改对象1的name变量

<!-- 第一个根元素 -->
<div id="vue-app-one">这里是:{{name}}</div> 

<!-- 第二个根元素 -->
<div id="vue-app-two">
    <p>这里是:{{name}}</p><br>
    <button @click="changeName">change-one-name</button>
    <!-- 点击后修改vue-app-one的name值-->
</div>
// 第一个vue对象
var one = new Vue({
    el:"#vue-app-one",
    data:{
        "name":"张三"
    }
})

 // 第二个vue对象
var two = new Vue({
    el:"#vue-app-two",
    data:{
        "name":"李四"
    },
    methods:{
        // 修改vue-app-one的name为'ccy333'
        changeName:function(){
            one.name = '张三哥哥'
        }
    }
})

效果:点击后修改”张三“为”张三哥哥“

全局组件

定义与使用

  • 定义全局组件,需给组件一个名字,调用时,将组件名当作标签名使用;相当于自定义标签,该标签下可以包含很多子html标签;

  • 这些子html标签定义在组件的template属性中,每次调用该组件,都渲染template里的标签

  • template里必须只有一个根元素

  • 在组件中,data是函数,将数据return回去

  • 依然可以用this来调用data中定义的数据

例子:

定义组件: ① 定义一个组件,命名为my-component

② 其中包含数据:name和方法:changeName

③ 渲染出的html效果有一个p标签,包含一个按钮,点击按钮时,修改name

④ 命名规范:camelCase (驼峰命名法) 与kebab-case (短横线分隔命名)

当写成标签时,遇到有大写字母的命名,需要改成小写并用横杆链接前后两个部分,如定义组件时命名为myComponent,写成标签时应写成;

组件定义时也可以用横杆法命名;

如果定义时用myComponent,标签用是OK的,系统自动识别

// 自定义的全局组件my-component
// template中只有一个根元素p标签,里面包含一个button按钮
Vue.component('my-component',{
    template:`<p>
        我的名字是:{{name}}
        <button @click='changeName()'>btn</button>
        </p>`,
    data(){
        return {
            name:'ccy'
        }
    },
    methods:{
        changeName:function(){
            this.name = '安之'
        }
    }
})
// vue对象1
new Vue({
    el:"#vue-app-one",
})
// vue对象2
new Vue({
    el:"#vue-app-two",
})

使用组件:

① 在vue对象对应的根元素(el指定标签)下使用
② 由于定义的是全局组件,所以可以在任意的vue对象下使用
③ 组件可复用,在一个vue对象下可以使用多次,且组件间互相独立

<div id="vue-app-one">
    <my-component></my-component>
    <my-component></my-component>
</div> 

<div id="vue-app-two">
    <my-component></my-component>
</div>

局部组件

  • 局部组件注册在某个vue对象中,
  • 只有注册过该局部组件的vue对象才能使用这个局部组件

例子:

局部组件定义

// template仅一个根元素:ul
var msgComponent = {
	 // 数据是自身提供的 (hobbies)
    template:`<ul><li v-for='hobby in hobbies' v-bind:key='hobby.id'>{{hobby}}</li></ul>`,
    data(){
        return {
            hobbies:['看剧','看动漫','吃好吃的']
        }
    }
}

注册局部组件:

// 仅由注册过该局部组件的vue对象才能使用,此处为div#vue-app-one
// 注意命名规范,components中对象的key将会被作为标签名,多个单词拼接的命名需使用横杆法
// 可以写成msg-component,此处直接简化了命名为msg,
new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent
    }
})

html文件中使用<msg></msg>

<div id="vue-app-one">
    <p>这里是vue-app-one</p>
    <mycomponent></mycomponent>
    <mycomponent></mycomponent>
    <p>我的爱好:</p>
    <msg></msg> <!--使用局部组件-->
</div>