Vue(二)

本文深入探讨了Vue.js中组件化的概念,包括全局组件与局部组件的区别,计算属性的使用,父子组件间的数据传递,以及如何通过自定义事件实现组件间的通信。同时,通过实例演示了如何利用Vue.js构建可复用的UI组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组件化的概念

组件化是指解耦复杂系统时将多个功能模块拆分、重组的过程,有多种属性、状态反映其内部特性。

先创建一个Vue模板实例

component(全局组件)

    <div id="app">
        <my-com></my-com>
    </div>

js部分 

        Vue.component('myCom',{
           template:`<div>{{msg}}</div>`,
            data(){
                return {
                    msg:'全局组件'
                }
            } 
        })
        new Vue({
            el:'#app',
        }) 

既然有全局组件,那么就有局部组件

components(局部组件)

        const myCom = {
            template:`<div>{{msg}}</div>`,
            data(){
                return {
                    msg:'局部组件'
                }
            }
        }
        new Vue({
            el:'#app',
            components:{
                myCom
            },
            data:{
                msg:'hello Vue'
            }
        }) 

你会发现全局组件、局部组件和Vue实例的data的值不同,前者是函数返回一个对象,后者是一个对象。这样做能保证数据的统一性,写成一个函数,并且返回新的对象,使得数据是唯一的,否则会当成公共值去处理,组件的data值用Vue实例化的data值来写的话,渲染不出来,并且会报错

计算属性get和set

        const myCom = {
            template:`<div>
                        <div>{{myShow}}</div>
                        <button @click="change">点击</button>
                      </div>`
            ,
            data(){
                return {
                    msg:'hello'
                }
            },
            methods:{
                change(){
                    this.myShow = 'hi'
                }
            },
            computed:{
                myShow:{
                   get(){
                        return this.msg + ' Vue'
                   },
                   set(val){
                       this.msg = val
                   }
                }
            }
        }

props(实现父子间数据传递)

用v-bind指令(:是v-bind:的简写)

    <div id="app">
        <my-com :msg="msg"></my-com>
    </div>

js部分 

        const myCom = {
            props:['msg'],
            template: `<div>
                          <div>{{msg}}</div>
                       </div>`,
            data() {
                return {
                    show: 'hello'
                }
            },
        }
        new Vue({
            el: '#app',
            components: {
                myCom
            },
            data:{
                msg:'father'
            }
        }) 

$emit(自定义事件)

通过子集的输入input值来监听改变父集的data值,从而渲染到页面(v-model是表单输入绑定,在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 )

    <div id="app">
        <div>father:{{sonValue}}</div>
        <my-com @tellme="tell"></my-com>
    </div>

js部分 

       const myCom = {
            template: `<div>
                         <input type="text" v-model="value"></input>
                       </div>`,
            data() {
                return {
                    value:''
                }
            },
            watch:{
                value(){
                    this.$emit('tellme',this.value)
                }
            }
        }
        new Vue({
            el: '#app',
            components: {
                myCom
            },
            data:{
                sonValue:''
            },
            methods:{
                tell(value){
                    this.sonValue = value
                }
            }
        })  

下面简单的做一个验证输入框

    <div id="app">
        <my-inp v-bind="bindmsg"></my-inp>
    </div>

js部分

        const myInp = {
            template: `<div>
                        <span>{{title}}</span>
                         <input type="text" v-model="value"></input>
                         <span>{{msg}}</span>
                       </div>`,
            data() {
                return {
                    value: ''
                }
            },
            props: {
                title: {
                    default: '',
                    type: String
                },
                reg: {
                    type: RegExp,
                    default: null
                },
                errmsg: {
                    type: String,
                    default: 'No'
                },
                sucmsg: {
                    type: String,
                    default: 'Yes'
                }
            },
            computed: {
                msg() {
                    if(this.value != ''){
                        return this.reg.test(this.value) ? this.sucmsg : this.errmsg
                    }
                }
            }
        }
        new Vue({
            el: '#app',
            components: {
                myInp
            },
            data: {
                bindmsg: {
                    title: '请输入QQ邮箱',
                    errmsg: '请重新输入',
                    sucmsg: '正确',
                    reg: /@qq.com/
                }
            }
        })

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值