1. 创建 Vue .Js组件
在 Vue.js 中,组件是一个 Vue 实例,可以包含模板、数据、方法、生命周期钩子等。
1.1 全局组件
全局组件可以在任何 Vue 实例中使用。
```javascript
// 定义一个全局组件
Vue.component('my-component', {
template: '
});
// 创建 Vue 实例
new Vue({
el: '#app'
});
```
在 HTML 中使用:
```html
```
1.2 局部组件
局部组件只能在定义它的 Vue 实例中使用。
```javascript
// 定义一个局部组件
const MyComponent = {
template: '
};
// 创建 Vue 实例
new Vue({
el: '#app',
components: {
'my-component': MyComponent
}
});
```
在 HTML 中使用:
```html
```
2. 组件通信
组件之间的通信是 Vue.Js 开发中的重要部分。常见的通信方式有:
2.1 父组件向子组件传递数据(Props)
父组件通过 `props` 向子组件传递数据。
```javascript
// 子组件
Vue.component('child-component', {
props: ['message'],
template: '
});
// 父组件
new Vue({
el: '#app',
data: {
parentMessage: '这是父组件传递的消息'
}
});
```
在 HTML 中使用:
```html
```
2.2 子组件向父组件传递数据(自定义事件)
子组件通过 `$emit` 触发自定义事件,父组件通过 `v-on` 监听事件并处理数据。
```javascript
// 子组件
Vue.component('child-component', {
template: `
`,
methods: {
sendMessage() {
this.$emit('message', '这是子组件发送的消息');
}
}
});
// 父组件
new Vue({
el: '#app',
data: {
receivedMessage: ''
},
methods: {
handleMessage(message) {
this.receivedMessage = message;
}
}
});
```
在 HTML 中使用:
```html
{{ receivedMessage }}
```
2.3 兄弟组件通信(事件总线或 Vuex)
兄弟组件之间可以通过事件总线或 Vuex 进行通信。
**事件总线示例:**
```javascript
// 创建事件总线
const eventBus = new Vue();
// 组件 A
Vue.component('component-a', {
template: `
`,
methods: {
sendMessage() {
eventBus.$emit('message', '这是组件 A 发送的消息');
}
}
});
// 组件 B
Vue.component('component-b', {
template: `
{{ receivedMessage }}
`,
data() {
return {
receivedMessage: ''
};
},
created() {
eventBus.$on('message', (message) => {
this.receivedMessage = message;
});
}
});
// 创建 Vue 实例
new Vue({
el: '#app'
});
```
在 HTML 中使用:
```html
```
3. 插槽(Slots)
插槽允许你在组件中插入内容。
3.1 默认插槽
```javascript
Vue.component('my-component', {
template: `
`
});
```
在 HTML 中使用:
```html
这是插入的内容
```
3.2 具名插槽
```javascript
Vue.component('my-component', {
template: `
`
});
```
在 HTML 中使用:
```html
这是主体内容
这是底部内容
```
4. 生命周期钩子
Vue 组件有一系列的生命周期钩子,可以在组件的不同阶段执行代码。
```javascript
Vue.component('my-component', {
template: '
beforeCreate() {
console.log('beforeCreate');
},
created() {
console.log('created');
},
beforeMount() {
console.log('beforeMount');
},
mounted() {
console.log('mounted');
},
beforeUpdate() {
console.log('beforeUpdate');
},
updated() {
console.log('updated');
},
beforeDestroy() {
console.log('beforeDestroy');
},
destroyed() {
console.log('destroyed');
}
});
```
5. 单文件组件(SFC)
在实际项目中,通常使用单文件组件(`.vue` 文件)来组织代码。
```vue
{{ message }}
export default {
data() {
return {
message: '这是一个单文件组件'
};
},
methods: {
changeMessage() {
this.message = '消息已改变';
}
}
};
p {
color: blue;
}
```
在 `main.Js` 中使用:
```javascript
import Vue from 'vue';
import MyComponent from './MyComponent.vue';
new Vue({
el: '#app',
components: {
MyComponent
}
});
```
在 HTML 中使用:
```html
```
6. Vuex 状态管理
对于复杂应用,可以使用 Vuex 进行状态管理。
```javascript
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
}
},
actions: {
increment({ commit }) {
commit('increment');
}
}
});
new Vue({
el: '#app',
store
});
```
在组件中使用:
```javascript
export default {
computed: {
count() {
return this.$store.state.count;
}
},
methods: {
increment() {
this.$store.