Vue —— 基础(七)(组件化编程【非单文件组件】)

简介: Vue —— 基础(七)(组件化编程【非单文件组件】)

一、基本使用

1. Vue 中使用组件的三大步骤:

  1. 定义组件(创建组件)
  2. 注册组件
  3. 使用组件(写组件标签)

2. 如何定义一个组件?

使用 Vue.extend(option) 创建,其中 options 和 new Vue(options) 时传入的那个 options 几乎一样,但也有点区别:


el 不要写,为什么? —— 最终所有的组件都要经过一个 vm 的管理,由 vm 中的 el 决定服务哪个容器。

data 必须写成函数,为什么? —— 避免组件被复用时,数据存在引用关系。

备注:使用 template 可以配置组件结构。

3. 如何注册组件?

  1. 局部组件: 靠 new Vue 的时候传入 components 选项
  2. 全局注册:靠 Vue.component ('组件名',组件)

4. 编写组件标签

<school></school>

实例:局部注册案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
    <!-- 引入Vue -->
    <script src="vue.js"></script>
</head>
<body>
    <div id='app'>
        <!-- 第三步:使用组件 -->
        <school></school>
    </div>
    <script>
        Vue.config.productionTip = false;   
        // 第一步:创建 school 组件
        const school = Vue.extend({
            template:`
                <div>
                    <h2>学校名称:{{schoolName}}</h2>
                    <h2>学校地址:{{address}}</h2>
                    <button @click="showName">点我提示学校名</button>
                </div>
            `,
            data(){
                return {
                    schoolName: '哔哩哔哩',
                    address: '中国'
                }
            },
            methods:{
                showName(){
                    alert(this.schoolName)
                }
            }
        })
        new Vue({
            el:'#app',
            // 第二步:注册组件(局部注册)
            components:{
                school
            }
        })
    </script>
</body>
</html>

90611957540b488599e5497a655c71da.png

实例:全局注册案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
    <!-- 引入Vue -->
    <script src="vue.js"></script>
</head>
<body>
    <div id='app'>
        <!-- 第三步:使用组件 -->
        <hello></hello>
    </div>
    <hr/>
    <div id='app2'>
        <!-- 第三步:使用组件 -->
        <hello></hello>
    </div>
    <script>
        Vue.config.productionTip = false;   
        // 第一步:创建 hello 组件
        const hello = Vue.extend({
            template:`
                <div>
                    <h2>Hello vue!</h2>    
                </div>
            `,
            data(){
                return {
                    name:'张三'
                }
            }
        })
        // 第二步:全局注册组件
        Vue.component('hello', hello)
        // 第一个实例
        new Vue({
            el:'#app',
        })
        // 第二个实例
        new Vue({
            el:'#app2'
        })
    </script>
</body>
</html>

3ab606653a604e95a22cbac52716a842.png

二、几个注意点

1. 关于组件名

一个单词组成:

  1. 第一种写法(首字母小写):school
  2. 第二种写法(首字母大写):School

多个单词组成:

  1. 第一种写法( kebab-case 命名):my-school
  2. 第二种写法( CamelCase 命名):Myschool (需要 Vue 脚手架支持)
  3. 备注:
  4. 组件名尽可能回避 HTML 中已有的元素名称,例如:h2、H2 都不行。
  5. 可以使用 name 配置项指定组件在开发者工具中呈现的名字。

2. 关于组件标签

  1. 第一种写法:<school></school>
  2. 第二种写法:<school/>

备注:不用使用脚手架时,<school/> 会导致后续组件不能渲染。

3. 简写方式

const school = Vue.extend(options) 可简写为: const school = options

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
    <!-- 引入Vue -->
    <script src="vue.js"></script>
</head>
<body>
    <div id='app'>
        <h2>{{msg}}</h2>
        <my-school></my-school>
    </div>
    <script>
        Vue.config.productionTip = false;   
        const s = Vue.extend({
            name: 'QingHua',
            template:`
                <div>
                    <h2>学校名称:{{name}}</h2>    
                    <h2>学校地址:{{address}}</h2>    
                </div>
            `,
            data(){
                return{
                    name: '清华大学',
                    address: '北京'
                }
            }
        })
        new Vue({
            el:'#app',
            data:{
                msg: 'Hello vue!',
            },
            components:{
                'my-school': s
            }
        })
    </script>
</body>
</html>

4ee401ead718477a83a3ff1e074cb104.png

a4c5c6ee0fb34858a0def615342a7d14.png

三、组件的嵌套

1. 把一个组件写入另一个组件,或把多个组件写入一个组件,从而达到嵌套的效果。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
    <!-- 引入Vue -->
    <script src="vue.js"></script>
</head>
<body>
    <div id='app'>
        <app></app>
    </div>
    <script>
        Vue.config.productionTip = false;   
        // 定义 student 组件
        const student = Vue.extend({
            name:'student',
            template:`
                <div>
                    <h3>学生姓名:{{name}}</h3>
                    <h3>学生年龄:{{age}}</h3>
                </div>
            `,
            data(){
                return{
                    name: '张三',
                    age: 8
                }
            }
        })
        // 定义 school 组件
        const school = Vue.extend({
            name:'school',
            template:`
                <div>
                    <h3>学校名称:{{name}}</h3>
                    <h3>学校地址:{{address}}</h3>
                    <student></student>
                </div>
            `,
            data(){
                return{
                    name: '清华大学',
                    address: '北京'
                }
            },
            components:{
                student
            }
        })
        // 定义 hello 组件
        const hello = Vue.extend({
            template:`
                <h1>{{msg}}</h1>
            `,
            data(){
                return{
                    msg: '努力学习vue!'
                }
            }
        })
        // 定义 app 组件
        const app = Vue.extend({
            template:`
                <div>
                    <hello></hello>
                    <school></school>
                </div>
            `,
            components:{
                school,
                hello
            }
        })
        new Vue({
            el: '#app',
            components:{
                app
            }
        })
    </script>
</body>
</html>

ba3de41c5de94707a4a93c74f75d46c0.png

四、VueComponent

1. school 组件

本质是一个名为 VueComponent 的构造函数,且不是程序员定义的,是 Vue.extend 生成的。

2. 我们需要写的是…

<school/> 或 <school></school> ,Vue 解析时会帮我们创建 school 组件的实例对象,即 Vue 帮我们执行的:new VueComponent(options) 。

3. 特别注意

每次调用 Vue.extend,返回的都是一个全新的 VueComponent 。

4. 关于this的指向:

组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的 this 均是 【VueComponent实例对象】。

new Vue(options)配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的 this 均是 【Vue实例对象】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
    <!-- 引入Vue -->
    <script src="vue.js"></script>
</head>
<body>
    <div id='app'>
        <school></school>
        <hello></hello>
    </div>
    <script>
        Vue.config.productionTip = false;   
        // 创建组件
        const school = Vue.extend({
            name:'school',  //指定组件在开发者工具中呈现的名字
            template:`
                <div>
                    <h2>学校名称:{{name}}</h2>    
                    <h2>学校地址:{{address}}</h2>
                    <button @click="showName">点我提示学校名</button>  
                </div>
            `,
            data(){
                return{
                    name:'清华大学',
                    address:'北京'
                }
            },
            methods:{
                showName(){
                    console.log('showName',this)
                }
            }
        })
        // 创建组件
        const hello = Vue.extend({
            template:`
                <h2>{{msg}}</h2>
            `,
            data(){
                return {
                    msg:'你好'
                }
            }
        })
        new Vue({
           el:'#app',
        // 注册组件
           components:{school,hello}
        })
    </script>
</body>
</html>

e0bccbaf93bf4b689847f97144fa3a03.png

五、一个重要的内置关系

1. 一个重要的内置关系:

VueComponent.prototype.__proto__ = Vue.prototype 。

2. 为什么要有这个关系:

让组件实例对象可以访问到 Vue 原型上的属性、方法。

07e311d3bb884080b64785438849c31c.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
    <!-- 引入Vue -->
    <script src="vue.js"></script>
</head>
<body>
    <div id='app'>
        <school></school>
    </div>
    <script>
        Vue.config.productionTip = false;   
        Vue.prototype.x = 99
        const school = Vue.extend({
            name:'school',  //指定组件在开发者工具中呈现的名字
            template:`
                <div>
                    <h2>学校名称:{{name}}</h2>    
                    <h2>学校地址:{{address}}</h2>
                    <button @click="showX">点我输出x</button>  
                </div>
            `,
            data(){
                return{
                    name:'清华大学',
                    address:'北京'
                }
            },
            methods:{
                showX(){
                    console.log(this.x)
                }
            }
        })
        new Vue({
            el:'#app',
            components:{
                school
            }
        })
    </script>
</body>
</html>

9deafb13a4a84f1cbde6f3ecd812415e.png

不积跬步无以至千里 不积小流无以成江海

相关文章
|
7天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
7天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
7天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1050 0
|
8天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
8天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
8天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
9天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
9天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
14天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发