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

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

相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
300 2
|
1月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
280 137
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
259 0
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
769 0
|
7月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1006 4
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
6月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
833 77
|
4月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
403 1
|
7月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍