【Vue】如何定义并注册一个组件?如何进行父子组件之间的通信?

news/2024/7/19 15:21:57 标签: vue, js, javascript

理解组件化

在大型应用开发的时候,往往要有大量的页面。

这些页面,又往往会有相同的部分,比如会有相同的头部导航、相同的底部页尾。

这些相同的部分,我们就可以把它封装为一个独立的组件,然后在不同的页面中使用它,避免重复开发。

 
 

全局注册

全局注册的组件,任何Vue实例都可以引用。

演示

<div id="app">
    <!-- 使用组件 -->
    <counter></counter>
</div>
<script type="text/javascript">javascript">
    // 定义组件
    const counter = {
        template: "<button @click='num++'>你戳了我{{num}}次~</button>",
        data() {
            return {num: 0};
        }
    };
    // 全局注册组件(参数1:自定义组件名,参数2:真正的组件)
    Vue.component("counter", counter);
    // Vue实例
    var app = new Vue({
        el: "#app",
    });
</script>

说明

❶ 组件本质上也是一个Vue实例;Vue实例也可以看成是一个组件。

❷ 组件中也可以定义data、methods、钩子函数…但是没有el属性,毕竟绑定了页面元素后还怎么复用呢?所以说:组件是一个不需要绑定页面元素的Vue实例。

❸ 组件不需要绑定模板(元素),但组件自带模板(元素)——即template属性。

❹ 组件的data非常特殊,它是一个返回对象的函数。请尝试理解一下:组件可以复用多个,但它们必须彼此独立,通过返回一个对象,每一个组件的数据也就有了一个独立的作用域。

 
 

局部注册

局部注册的组件,只有当前的Vue实例可以引用。

演示

<div id="app">
    <!-- 使用组件 -->
    <counter></counter>
</div>
<script type="text/javascript">javascript">
    // 定义组件
    const counter = {
        template: "<button @click='num++'>你戳了我{{num}}次~</button>",
        data() {
            return {num: 0};
        }
    };
    // Vue实例
    var app = new Vue({
        el: "#app",
        components: {
            // 局部注册组件(左侧:自定义组件名,右侧:真正的组件)
            counter: counter
        }
    });
</script>

说明

❶ 总的看来,全局注册的组件可引用范围较大,局部注册的组件可引用范围较小。具体选择哪种注册,要具体分析某个模块所出现的区域——仅仅在一个页面的角落出现多次?还是在多个页面都会出现?

❷ 关于组件的作用域,也可以这样来理解记忆——全局注册是写在javascript当中的,所以它的作用域是任何地方;局部注册是写在vue实例当中的,vue实例绑定了一个el属性,局部注册的组件自然也被绑定在这个el元素的内部了。

❸ 没别的好说的了 >_<。

 
 

父组件向子组件通信

Demo1:子组件使用了父组件的数据(简单数据类型)

<div id="father">
    <son v-bind:title="msg"></son>
</div>
<script type="text/javascript">javascript">
    // 定义组件
    const son = {
        // 子组件中渲染了title,但子组件并没有title啊?
        template: "<h2>{{title}}</h2>",
        // 原来这个title是从父组件那里接收过来的!
        props: ["title"]
    };
    // 注册组件
    Vue.component("son", son);
    // Vue实例
    var father = new Vue({
        el: "#father",
        data: {
            msg: "我是父组件的数据信息~"
        }
    });
</script>

Demo2:子组件使用了父组件的数据(复杂数据类型)

<div id="father">
    <son v-bind:lolis="msg"></son>
</div>
<script type="text/javascript">javascript">
    // 定义组件
    const son = {
        // 子组件中渲染了lolis,但子组件并没有lolis啊?
        template: "<ul><li v-for='loli in lolis'>{{loli}}</li></ul>",
        // 原来这个lolis是从父组件那里接收过来的!
        props: {
            lolis: {
                // 数据类型(Array/Object)
                type: Array,
                // 默认值
                default: []
            }
        }
    };
    // 注册组件
    Vue.component("son", son);
    // Vue实例
    var father = new Vue({
        el: "#father",
        data: {
            msg: ["Alice", "Hana", "Mana"]
        }
    });
</script>

 
 

子组件向父组件通信

Demo3:子组件中调用父组件的方法从而改变父组件的数据

<div id="father">
    <h2>{{num}}</h2>
    <son @incnumber="inc" @decnumber="dec" v-bind:number="num"></son>
</div>
<script type="text/javascript">javascript">
    // 定义组件
    const son = {
        template: "<div><button @click='increase'>加1</button><button @click='decrease'>减1</button></div>",
        props: ["number"],
        methods: {
            increase() {
                return this.$emit("incnumber");
            },
            decrease() {
                return this.$emit("decnumber");
            }
        }
    };
    // 注册组件
    Vue.component("son", son);
    // Vue实例
    var father = new Vue({
        el: "#father",
        data: {
            num: 0
        },
        methods: {
            inc() {
                this.num++;
            },
            dec() {
                this.num--;
            }
        }
    });
</script>

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

❤️


http://www.niftyadmin.cn/n/1329995.html

相关文章

final、权限、内部类、引用类型

final&#xff1a; 不可改变。可以用于修饰类、方法和变量。 类&#xff1a;被修饰的类&#xff0c;不能被继承。 方法&#xff1a;被修饰的方法&#xff0c;不能被重写。 变量&#xff1a;被修饰的变量&#xff0c;不能被重新赋值 在Java中提供了四种访问权限&#xff0c;使用…

object类.常用API(一)

1.Object类 Object类是Java语言中的根类&#xff0c;即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候&#xff0c;最终找的父类就是Object。1.1toString 方法 toString方法返回该对象的字符串表示&#xff0c;其实该字符串内容就是对象的类型内存地址…

【Vue】Vue中的Ajax——axios组件详解

axios简介 Vue并不能直接支持ajax&#xff0c;所以通过组件来实现ajax异步请求。 最为推荐的组件就是 axios。 在进行下面的学习之前&#xff0c;先把这个组件安装到本地&#xff1a; npm install axios请求 axios这样发出请求&#xff1a;axios(config)axios.get(url[, c…

Object类、常用API(二)

java.util.Calendar是日历类&#xff0c;在Date后出现&#xff0c;替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量&#xff0c;方便获取。日历类就是方便获取各个时间属性的。 Calendar为抽象类&#xff0c;由于语言敏感性&#xff0c;Calendar类在创…

【LeetCode】Sama的个人记录_56

不要想的太复杂。自定义一个排序器即可&#xff1a; Arrays.sort(strings, (o1, o2) -> (o2 o1).compareTo(o1 o2)); 说明&#xff1a; 1. 这里的排序器的特殊之处在于&#xff0c;不是比较两个独立的元素&#xff0c;而是比较两个元素的组成结果———但这是可行的。 2. …

Collection、泛型

* 数组的长度是固定的。集合的长度是可变的。 * 数组中存储的是同一类型的元素&#xff0c;可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候&#xff0c;使用集合进行存储。 JAVASE提供了满足各种需求的API&#xff0c;在使…

list、set

常见的数据结构数据存储的常用结构有&#xff1a;栈、队列、数组、链表和红黑树。我们分别来了解一下&#xff1a;#### 栈* **栈**&#xff1a;**stack**,又称堆栈&#xff0c;它是运算受限的线性表&#xff0c;其限制是仅允许在标的一端进行插入和删除操作&#xff0c;不允许在…

【Node.js】一篇文章带你彻底理解Node.js及其特性

什么是Node.js 简单的说&#xff0c;Node.js就是运行在服务端的JavaScript&#xff0c;它打破了JavaScript只能在浏览器运行的局面&#xff0c;并且让JavaScript的生态建设走向正轨。 Node.js最初的开发者&#xff0c;是想要写一个基于事件驱动的、非阻塞I/O的Web服务器&…