组件化
Vue 的组件化核心是组件系统,利用 ES 模块化完成了 Vue 组件系统的构建
组件化 是 抽象小型、独立、可预先定义配置、可利用的组件
- 小型 页面的构成拆分成一个个小单元
- 独立 每一个小单元心可能都独立开发
- 预先定义 小单元都可以先定义好,在需要的时候导入使用
- 预先配置 小单元可以接收一些在使用时需要的一些配置
- 可复用 小单元可以在多个地方使用
可利用性要适当地考量
- 有些组件确实是不需复用
- 可配置性越高, 功能性就越强
组件最大的作用是独立开发、预先配置
- 为了更好的维护和扩展
应用实例
createApp -> 创建 APP -> 返回一个应用实例
应用实例主要用来注册全局组件
- 实例上暴露了很多方法
- component 注册组件
- directive 注册指令
- filter 注册过滤器
- use 使用插件
- 大多数这样的主方法都会返回 createApp 创建出来的应用实例
允许链式操作 ```javascript // Application 应用 const app = Vue.createApp({});
// 返回原本的应用实例
app.component(‘MyTitle’, {
data() {
return {
title: ‘I LOVE VUE!!!’
}
},
template: <h1 v-to-lower-case>{{ title }}</h1>
}).directive(‘toLowerCase’, {
mounted(el) {
el.addEventListener(‘click’, function() {
this.innerText = this.innerText.toLowerCase();
}, false);
}
});
app.mount(‘#app’);
```html
<div id="app">
<my-title></my-title>
</div>
根组件
根组件的本质就是一个对象 {}
createApp 执行的时候需要一个根组件 createApp({})
根组件是 Vue 渲染的起点
根元素是一个 HTML 元素
createApp 执行创建 Vue 应用实例时,需要一个 HTML 根元素 <div id="app"></div>
const RootComponent = {
data() {
return {
a: 1,
b: 2,
total: 0
}
},
mounted() {
this.plus();
},
methods: {
plus() {
return this.a + this.b;
}
},
template: `<h1>{{ a }} + {{ b }} = {{ total }}</h1>`
}
const app = Vue.createApp(RootComponent);
const vm = app.mount('#app');
mount 方法执行返回的是根组件实例
vm -> ViewModel -> MVVM -> VM
Vue 不是一个完整的 MVVM 模型
组件实例
每个组件都有自己的组件实例
一个应用所有组件都共享一个应用实例
无论是根组件还是应用内其它的组件,配置选项、组件行为是都一样的
const MyTitle = {
props: ['content']
template: `
<h1 :title="content">
<slot></slot>
</h1>
`,
mounted() {
console.log(this);
}
}
const MyAuthor = {
template: `
<p>
Author: <slot></slot>
</p>
`
}
const MyContent = {
template: `
<p @click="toLowerCase">
<slot></slot>
</p>
`,
methods: {
toLowerCase() {
this.$emit('to-lower-case');
}
}
}
const App = {
component: {
MyTitle,
MyAuthor,
MyContent
},
data() {
return {
title: 'This is a TITLE',
author: 'Xiaoye',
content: 'This is a CONTENT'
}
},
template: `
<div>
<my-title :content="title">{{ title }}</my-title>
<my-author>{{ author }}</my-title>
<my-content @to-lower-case="toLowerCase">{{ content }}</my-title>
</div>
`,
methods: {
toLowerCase() {
this.content = this.content.toLowerCase();
}
}
}
const app = Vue.createApp(App);
const vm = app.mount("#app“)
组件实例可以添加一些属性 property
data / props / components / methods …
this -> $attres / $emit Vue 组件实例内置方法 $