效果:

组件是不是vue的特性

data是一个函数

在vue对象中,data属性值是一个对象,比如这样的:

组件是不是vue的特性

但是在全局组件中,同一份data可能被多个vue对象使用,每个对象不单独维护一份data时,如果某一个vue对象修改了data中的一个变量,其他vue对象获取data时就会被影响;

如果用上面的例子做案例,若组件中的data是对象(引用),其他地方均不改变,两个vue对象便共享同一个name变量;当我通过其中一个vue对象改变name数据时(即点击任一个btn按钮),另一个对象获得的name也发生了改变(其他按钮处的’ccy’也都被改成了’安之’)

因此,为保证数据的独立性,即每个实例可以维护一份被返回对象的独立的拷贝,data为每个实例都return一份新创建的数据,不同的vue对象获取的data均互不影响

在vscode中不允许组件中的data是对象,会报错:

[Vue warn]: The “data” optionshould be a functionthat returns a per-instance value in component definitions.

局部组件

例子:

局部组件定义:

// template仅一个根元素:ul
var msgComponent = {
	// 数据是自身提供的 (hobbies)
    template:``,
    data(){
        return {
            hobbies:['看剧','看动漫','吃好吃的']
        }
    }
}

注册局部组件:

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

html文件中使用


    

这里是vue-app-one

              

我的爱好:

     

效果:红框圈出的部分就是局部组件渲染出来的

组件是不是vue的特性

父向子传值/传引用:prop

静态传值

创建子组件:

var titleComponent = {
    props:["title"],
    template:`

{{title}}

`     // 所需要的数据title由父组件提供 }

在父组件的components属性中注册子组件:

new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent,
        "titleComponent":titleComponent
    },
})

在父组件上使用子组件:



    

这里是vue-app-one

                   

效果:红框标记处就是父向子传值并展示

组件是不是vue的特性

动态传值:v-bind

定义子组件:

var titleComponent = {
    props:["title"],
    template:`

{{title}}

` }

在父组件的components属性中注册子组件:

new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent,
        "titleComponent":titleComponent
    },
    data(){
        return {
            title:"my hobbies are ",
        }
    }
})

使用子组件,通过绑定父组件data中的变量title来实现动态传值:



    

这里是vue-app-one

                        

效果:红框处就是动态绑定获取数据的展示

组件是不是vue的特性

传递数组等复杂数据时,也可以使用v-bind来动态传值,如:
需要向子级传递hobbies数组,在vue实例对象(父)中创建数据hobbies

new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent,
        "titleComponent":titleComponent
    },
    data:{
        title:"my hobbies are ",
        hobbies:['看剧','看动漫','吃好吃的'], //需要向子组件传递的数据
    }
})

定义子组件

var msgComponent = {
    template:`
            

{{hobby}}

            `,     props:["hobby"],     data(){         return {            }     } }

使用子组件



    

这里是vue-app-one

                        

效果:

组件是不是vue的特性

跳回“一点想法”处

子向父:事件传值$emit

子组件不能通过prop向父组件传递数据,需要使用事件向父组件抛出一个值,告知父组件我需要实现一个功能,由父组件处理这个事件

例子:点击按钮,改变名称chinesename
(由于data变量名不支持chinese-name形式,花括号里不支持chineseName形式,所以这里我都用了小写,此处记录一下,日后学到了新知再来填坑)

先在父组件的data中定义chinesename的初始值:

new Vue({
    el:"#vue-app-one",
    data:{
         chinesename:"anzhi" // chinesename初始值
    }
})

创建子组件,并注册事件change-name(就像click事件一样,需要让系统能够辨认这是一个事件并监听,当事件被触发时,执行某项约定好的操作):

  Vue.component('blog-post', {
    props: ['chinesename'],
    template: `
      
        
{{ chinesename }}
                     修改名字                     `     // blog-post组件包含一个h5,显示chinesename,和一个按钮     // 点击这个按钮,触发change-name事件,将"ruosu"作为参数传递给指定的处理函数onChangeName   })

在父组件中使用子组件,定义change-name的处理函数为onChangeName:


    

这里是vue-app-one

      

在父组件处定义事件处理函数onChangeName:

new Vue({
    el:"#vue-app-one",
    data:{
          chinesename:"anzhi"
    },
    methods:{
        onChangeName:function(value){
        	// 将chinesename换成传递过来的数据
            this.chinesename=value
        }
    }
})

效果:

组件是不是vue的特性

一点想法

关于父子组件的区分,在此写一点总结,还是日后学了新知识再来填坑

官网中没有很明确指明两者的定义和区别,在网上搜了一圈,觉得比较多人认可并且好理解的是:

在前面这些父子传值的例子中,我们可以看到,对于局部组件,我们会在某个html根元素中注册并使用,所以此时el指定的根元素在html文件中是这个局部组件的父组件,局部组件在html使用时便是这个父组件的一份子,承担数据传输的责任
跳转到父向子动态传值案例

组件是不是vue的特性

组件是不是vue的特性

再用绕口令说一波,即:title-component组件定义处与使用处,两者身份是不一样的,在定义处,它是局部组件,也是子组件,需注册才能使用;在使用处,它是根元素的包含一部分,根元素为父组件,而“它”,承担着父组件与子组件数据沟通的重任

这个总结在全局组件情况下也适用,使用该全局组件的根元素是父组件,如上面的子向父传值的案例,p#vue-app-one是父组件,作为父子组件沟通的桥梁,全局组件blog-post为子组件

图示:

组件是不是vue的特性


如果是子组件又嵌套了子组件,被嵌套的组件是子子组件,以此类推

到此,关于“组件是不是vue的特性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


新闻标题:组件是不是vue的特性
当前地址:http://tjjierui.cn/article/jiceed.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP