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

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

相关文章
|
14天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
82 1
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
157 64
|
25天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
47 8
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
95 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量
|
JavaScript
vue 组件传值
vue 组件传值
93 0
|
JavaScript
vue父子组件传值
vue父子组件传值
|
JavaScript
vue兄弟组件传值 方便快捷
vue兄弟组件传值 方便快捷