使用vue-cli创建:
## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
vue --version
## 安装或者升级你的@vue/cli
npm install -g @vue/cli
## 创建
vue create vue_test
## 启动
cd vue_test
npm run serve
使用vite创建:
官方文档:快速上手 | Vue.js
vite官网:Vite中文网
## 创建工程
npm init vite-app
## 进入工程目录
cd
## 安装依赖
npm install
## 运行
npm run dev
官方文档: 组合式 API 常见问答 | Vue.js
一个人的信息
姓名:name
年龄:age
6.setup的两个注意点
一个人的信息
姓名:{{name}}
年龄:{{age}}
工作:{{job.type}}
薪水:{{job.salary}}
一个人的信息
姓名:{{person.name}}
年龄:{{person.age}}
工作:{{person.job.type}}
薪水:{{person.job.salary}}
测试数据c: {{person.job.a.b.c}}
测试数据hobby:{{person.hobby[0]}}
---------------------------------------------------------
Object.defineProperty(data, 'count', {
get () {},
set () {}
})
new Proxy(data, {
// 拦截读取属性值
get (target, prop) {
return Reflect.get(target, prop)
},
// 拦截设置属性值或添加新属性
set (target, prop, value) {
return Reflect.set(target, prop, value)
},
// 拦截删除属性
deleteProperty (target, prop) {
return Reflect.deleteProperty(target, prop)
}
})
proxy.name = 'tom'
-----------------------------------------------
与Vue2.x中computed配置功能一致
import {computed} from 'vue'
setup(){
...
//计算属性——简写
let fullName = computed(()=>{
return person.firstName + '-' + person.lastName
})
//计算属性——完整
let fullName = computed({
get(){
return person.firstName + '-' + person.lastName
},
set(value){
const nameArr = value.split('-')
person.firstName = nameArr[0]
person.lastName = nameArr[1]
}
})
}
//情况一:监视ref定义的响应式数据
watch(sum,(newValue,oldValue)=>{
console.log('sum变化了',newValue,oldValue)
},{immediate:true})
//情况二:监视多个ref定义的响应式数据
watch([sum,msg],(newValue,oldValue)=>{
console.log('sum或msg变化了',newValue,oldValue)
})
/* 情况三:监视reactive定义的响应式数据
若watch监视的是reactive定义的响应式数据,则无法正确获得oldValue!!
若watch监视的是reactive定义的响应式数据,则强制开启了深度监视
*/
watch(person,(newValue,oldValue)=>{
console.log('person变化了',newValue,oldValue)
},{immediate:true,deep:false}) //此处的deep配置不再奏效
//情况四:监视reactive定义的响应式数据中的某个属性
watch(()=>person.job,(newValue,oldValue)=>{
console.log('person的job变化了',newValue,oldValue)
},{immediate:true,deep:true})
//情况五:监视reactive定义的响应式数据中的某些属性
watch([()=>person.job,()=>person.name],(newValue,oldValue)=>{
console.log('person的job变化了',newValue,oldValue)
},{immediate:true,deep:true})
//特殊情况
watch(()=>person.job,(newValue,oldValue)=>{
console.log('person的job变化了',newValue,oldValue)
},{deep:true}) //此处由于监视的是reactive素定义的对象中的某个属性,所以deep配置有效
//watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。
watchEffect(()=>{
const x1 = sum.value
const x2 = person.age
console.log('watchEffect配置的回调执行了')
})
Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名:
Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下:
src/hooks/usePoint.js
import { reactive, onMounted, onUnmounted } from "vue"
export default function() {
// 实现鼠标打点的数据
let point = reactive({
x:0,
y:0
})
// 实现鼠标打点的方法
function savePoint(event) {
point.x = event.pageX
point.y = event.pageY
}
// 实现鼠标打点的钩子
onMounted(()=>{
window.addEventListener('click', savePoint)
})
onUnmounted(() => {
window.removeEventListener('click', savePoint)
})
return point
}
使用:
姓名:{{name}}
年龄:{{age}}
薪资:{{job.j1.salary}}K
当前的x.y值是:{{x.y}}
{{person}}
姓名:{{name}}
年龄:{{age}}
薪资:{{job.j1.salary}}K
当前求和为:{{sum}}
姓名:{{name}}
年龄:{{age}}
薪资:{{job.j1.salary}}K
当前求和为:{{sum}}
姓名:{{name}}
年龄:{{age}}
薪资:{{job.j1.salary}}K
座驾信息:{{person.car}}
{{keyword}}
setup(){
......
let car = reactive({name:'奔驰',price:'40万'})
provide('car',car)
......
}
setup(props,context){
......
const car = inject('car')
return {car}
......
}
Options API 存在的问题:使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改 。
Composition API 的优势:我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。
我是一个弹窗
等待异步组件时渲染一些额外内容,让应用有更好的用户体验
异步引入组件:
import {defineAsyncComponent} from 'vue'
const Child = defineAsyncComponent(()=>import('./components/Child.vue'))
使用Suspense包裹组件,并配置好default 与 fallback:
我是App组件
加载中.....
//注册全局组件
Vue.component('MyButton', {
data: () => ({
count: 0
}),
template: ''
})
//注册全局指令
Vue.directive('focus', {
inserted: el => el.focus()
}
2.x 全局 API(Vue) |
3.x 实例 API (app) |
Vue.config.xxxx |
app.config.xxxx |
Vue.config.productionTip |
移除 |
Vue.component |
app.component |
Vue.directive |
app.directive |
Vue.mixin |
app.mixin |
Vue.use |
app.use |
Vue.prototype |
app.config.globalProperties |
.v-enter,
.v-leave-to {
opacity: 0;
}
.v-leave,
.v-enter-to {
opacity: 1;
}
.v-enter-from,
.v-leave-to {
opacity: 0;
}
.v-leave-from,
.v-enter-to {
opacity: 1;
}