Vue是一套用于构建用户界面的渐进式框架,它采用MVVM模式,通过数据驱动视图,并且提供了响应式和组件化的思想,使得开发者可以更加轻松地构建交互式的应用程序。
Vue可以用于构建用户界面,它提供了一系列的指令和组件,包括v-bind、v-model、v-if、v-for等等,同时也支持自定义指令和组件。通过这些指令和组件,开发者可以快速地搭建各种类型的用户界面,例如表单、列表、导航等等。
Vue的核心库只关注视图层- Vue的核心库只关注视图层,因此它易于学习和集成到其他项目中。
模板语法
<div>{{ message }}</div>
<img v-bind:src="imageSrc">
<div v-if="isShow">显示的内容</div>
<ul>
<li v-for="item in items">{{ item }}</li>
</ul>
<button v-on:click="handleClick">点击</button>
<div>{{ reversedMessage }}</div>
...
computed: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
watch: {
message: function (newVal, oldVal) {
console.log('message changed from', oldVal, 'to', newVal)
}
}
created: function () {
console.log('组件实例创建完成')
},
mounted: function () {
console.log('组件挂载到DOM上')
},
updated: function () {
console.log('组件更新')
},
destroyed: function () {
console.log('组件销毁')
}
指令名称 | 描述 |
---|---|
v-bind | 用于绑定属性值 |
v-model | 用于实现表单数据的双向绑定 |
v-if | 用于根据条件判断是否渲染元素 |
v-for | 用于循环渲染元素 |
v-on | 用于绑定事件监听 |
v-show | 用于根据条件判断是否显示元素 |
v-text | 用于将元素的文本内容设置为指定的值 |
v-html | 用于将元素的HTML内容设置为指定的值 |
v-pre | 用于跳过指定元素和它的子元素的编译过程 |
v-cloak | 用于防止页面闪动 |
v-once | 用于只渲染元素一次 |
组件
示例1:
<template>
<div>
<h1>{{title}}</h1>
<p>{{content}}</p>
</div>
</template>
<script>
export default {
data() {
return {
title: '这是标题',
content: '这是内容'
}
}
}
</script>
示例2:
<template>
<div>
<input v-model="message">
<p>{{message}}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: ''
}
}
}
</script>
生命周期
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染、更新、卸载等一系列过程,我们称这是Vue的生命周期。常用的生命周期有以下几种:
beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
created:实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算,watch/event事件回调。然而,挂载阶段还没开始,$el属性目前不可见。
beforeMount:在挂载开始之前被调用:相关的render函数首次被调用。
mounted:el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子。
beforeUpdate:数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。
updated:由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子。
beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
destroyed:实例销毁之后调用。此时,所有的指令都已经解绑,所有的事件监听器都已经移除,所有的子实例也已经被销毁。
计算属性
<template>
<div>
<p>{{ message }}</p>
<p>{{ reversedMessage }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello World'
}
},
computed: {
reversedMessage() {
return this.message.split('').reverse().join('')
}
}
}
</script>
这里我们定义了一个计算属性reversedMessage,它返回的是message的反转字符串。在模板中,我们可以直接使用reversedMessage,而不需要在模板中写逻辑代码来实现反转字符串的功能。计算属性的值会被缓存,只有在相关依赖发生改变时才会重新求值。
var vm = new Vue({
data: {
message: 'Hello'
},
watch: {
message: function (newVal, oldVal) {
console.log('newVal: ', newVal, ' oldVal: ', oldVal)
}
}
})
深度监听:
var vm = new Vue({
data: {
obj: {
a: 1
}
},
watch: {
'obj.a': function (newVal, oldVal) {
console.log('newVal: ', newVal, ' oldVal: ', oldVal)
}
}
})
var vm = new Vue({
data: {
message: 'Hello'
},
watch: {
message: {
handler: function (newVal, oldVal) {
console.log('newVal: ', newVal, ' oldVal: ', oldVal)
},
immediate: true
}
}
})
自定义指令
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
// 当绑定元素插入到 DOM 中。
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
// 局部注册一个自定义指令
directives: {
focus: {
// 指令的定义
inserted: function (el) {
el.focus()
}
}
}
Mixin混入
Mixin是一种Vue提供的可重用功能的方式,它允许我们将一组组件选项合并为一个单独的对象,然后将其用作多个组件中的选项。这使得我们可以在多个组件之间共享相同的选项,从而避免了重复代码的出现。
// 定义一个mixin对象
const myMixin = {
created() {
console.log('mixin created')
},
methods: {
foo() {
console.log('mixin foo')
}
}
}
// 在组件中使用mixin
export default {
mixins: [myMixin],
created() {
console.log('component created')
},
methods: {
bar() {
console.log('component bar')
}
}
}
在上面的例子中,我们定义了一个名为myMixin的mixin对象,它包含了一个created钩子函数和一个名为foo的方法。然后,我们在组件中使用mixins选项将myMixin混入到组件中。最终,组件中包含了myMixin中定义的选项,同时也保留了组件自身的选项。
当组件和mixin中含有相同的选项时,组件的选项会覆盖mixin中的选项。如果我们希望在组件中调用mixin中的方法,可以使用$emit来触发mixin中的方法。
export default {
mixins: [myMixin],
created() {
this.$emit('foo')
}
}
<transition>
<p v-if="show">hello</p>
</transition>
<transition name="fade">
<p v-if="show">hello</p>
</transition>
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter"
v-on:enter-cancelled="enterCancelled"
>
<p v-if="show">hello</p>
</transition>
<transition name="fade" mode="out-in">
<p :key="message">{{ message }}</p>
</transition>
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter"
v-on:enter-cancelled="enterCancelled"
>
<p :key="message">{{ message }}</p>
</transition>
<transition-group name="list" tag="ul">
<li v-for="item in items" :key="item">{{ item }}</li>
</transition-group>
<transition
name="fade"
enter-active-class="animated fadeIn"
leave-active-class="animated fadeOut"
>
<p v-if="show">hello</p>
</transition>
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter"
v-on:enter-cancelled="enterCancelled"
v-on:before-leave="beforeLeave"
v-on:leave="leave"
v-on:after-leave="afterLeave"
v-on:leave-cancelled="leaveCancelled"
>
<p v-if="show">hello</p>
</transition>
// 安装路由
npm install vue-router --save
// 引入路由
import VueRouter from 'vue-router'
// 配置路由
const router = new VueRouter({
routes: [
{
path: '/',
component: Home
},
{
path: '/about',
component: About
}
]
})
// 注册路由
new Vue({
router,
render: h => h(App)
}).$mount('#app')
// 配置路由
const router = new VueRouter({
routes: [
{
path: '/',
component: Home,
children: [
{
path: 'child',
component: Child
}
]
}
]
})
// 配置路由
const router = new VueRouter({
routes: [
{
path: '/user/:id',
component: User
}
]
})
// 跳转路由
this.$router.push('/user/123')
// 配置路由
const router = new VueRouter({
routes: [
{
path: '/',
component: Home,
name: 'home'
}
]
})
// 跳转路由
this.$router.push({ name: 'home' })
// 配置路由
const router = new VueRouter({
routes: [
{
path: '/user/:id',
component: User
}
]
})
// 跳转路由
this.$router.push({ path: '/user/123', query: { name: '张三' } })
// 接收参数
this.$route.params.id // 123
this.$route.query.name // 张三
// 配置路由
const router = new VueRouter({
routes: [
{
path: '/user',
component: () => import('./User.vue')
}
]
})
// 全局前置守卫
router.beforeEach((to, from, next) => {
// 判断是否登录
if (to.path !== '/login' && !isLogin) {
next('/login')
} else {
next()
}
})
// 全局后置守卫
router.afterEach((to, from) => {
// 统计PV
pv++
})
Vuex状态管理- Vuex状态管理
Vuex是Vue的官方状态管理库,用于管理应用程序的所有组件的状态。它将应用程序的状态集中存储在一个单一的地方,使得状态变化更容易跟踪和调试。以下是一个简单的Vuex状态管理的示例:
// 定义一个Vuex store
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
},
getters: {
doubleCount(state) {
return state.count * 2
}
}
})
// 在Vue组件中使用Vuex
<template>
<div>
<p>Count: {{ count }}</p>
<p>Double count: {{ doubleCount }}</p>
<button @click="incrementCount">Increment count</button>
</div>
</template>
<script>
export default {
computed: {
count() {
return this.$store.state.count
},
doubleCount() {
return this.$store.getters.doubleCount
}
},
methods: {
incrementCount() {
this.$store.commit('increment')
}
}
}
</script>
在上面的示例中,我们定义了一个简单的Vuex store,包含一个状态count
和一个increment
的mutation,用于增加count
的值。我们还定义了一个incrementAsync
的action,用于异步增加count
的值。最后,我们定义了一个doubleCount
的getter,用于计算count
的两倍。在Vue组件中,我们使用computed
属性获取状态和getter的值,并使用methods
属性触发mutation。
Vue CLI
Vue Router
Vue Test Utils
Element UI
默认按钮
Ant Design Vue- Ant Design Vue:Ant Design Vue是蚂蚁金服开发的一套基于Vue.js的UI组件库,它提供了一系列常用的UI组件,如按钮、表单、表格、弹窗等,可以帮助开发者快速构建美观、易用的Web应用。Ant Design Vue还提供了丰富的主题定制功能,可以让开发者根据自己的需求定制出符合自己品牌风格的UI组件。
渐进式框架,易于学习和使用
数据驱动视图,提高开发效率
组件化开发,易于维护和复用
组件化开发:Vue采用组件化开发的方式,将页面拆分成多个组件,每个组件只关注自身的逻辑和样式,提高了代码的可读性和可维护性,同时也方便了组件的复用。
易于维护和复用:Vue提供了丰富的API和插件,使得开发者可以快速地构建可复用的组件和模块,同时也方便了项目的维护和升级。
轻量级,加载速度快- 轻量级:Vue.js 只关注视图层,因此它是一个轻量级的框架。它不像 Angular 那样臃肿,因为它使用了虚拟 DOM,可以快速渲染视图并提高性能。
对SEO不友好
对SEO不友好
由于Vue是在客户端渲染的,而搜索引擎爬虫只会抓取HTML,因此Vue的SEO不如服务器端渲染的网站,需要进行额外的处理才能提升SEO效果。
相对于React,生态系统不够完善
对于大型应用,需要额外的状态管理工具- 对于大型应用,需要额外的状态管理工具:
例如,Vuex 是一个专门为 Vue.js 应用程序开发的状态管理库。当应用程序变得非常大且复杂时,Vue.js 可能不足以处理所有状态。在这种情况下,您可以使用 Vuex 来管理应用程序的状态。