## 查看@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
## 创建工程
npm init vite-app <project-name>
## 进入工程目录
cd <project-name>
## 安装依赖
npm install
## 运行
npm run dev
在 Vue3.0 中变量必须 return 出来, template 中才能使用;而在 Vue3.2 中只需要在 script 标签上加上 setup 属性,无需 return , template 便可直接使用。
Vue3.0写法:
<script>
import {ref} from 'vue'
export default {
name: 'App',
setup(){
//数据
let name = ref('张三')
let age = ref(18)
let job = ref({
type:'前端工程师',
salary:'30K'
})
//方法
function changeInfo(){
console.log(job.value)
}
//返回一个对象(常用)
return {
name,
age,
job,
changeInfo
}
}
}
</script>
Vue3.2 setup写法(推荐使用):
只需在script标签中加入setup即可, template 便可直接使用定义的方法和属性
<script setup>
import {
ref,
reactive,
toRefs,
} from 'vue'
const data = reactive({
patternVisible: false,
debugVisible: false,
aboutExeVisible: false,
})
const content = ref('content')
//使用toRefs解构
const { patternVisible, debugVisible, aboutExeVisible } = toRefs(data)
</script>
注意事项:
1.可以和vue2配置混用,但尽量不要与Vue2.x配置混用
2.setup不能是一个async函数,因为返回值不再是return的对象, 而是promise, 模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)
{{xxx}}
<template>
<h1>一个人的信息h1>
<h2>姓名:{{name}}h2>
<h2>年龄:{{age}}h2>
<h3>工作种类:{{job.type}}h3>
<h3>工作薪水:{{job.salary}}h3>
<button @click="changeInfo">修改人的信息button>
template>
<script>
import {ref} from 'vue'
export default {
name: 'App',
setup(){
//数据
let name = ref('张三')
let age = ref(18)
let job = ref({
type:'前端工程师',
salary:'30K'
})
//方法
function changeInfo(){
console.log(job.value)
}
//返回一个对象(常用)
return {
name,
age,
job,
changeInfo
}
}
}
script>
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配置的回调执行了')
})
第一步:自定义usePoint.js函数(代表一个hook函数)
里面可以引入组合式api,最后必须要有返回值
import {reactive,onMounted, onBeforeUnmount } from 'vue';
export default ()=>{
let point = reactive({
x:0,
y:0
})
function savePoint(e){
point.x = e.pageX;
point.y = e.pageY;
console.log(e.pageX,e.pageY);
}
onMounted(()=>{
window.addEventListener('click',savePoint)
})
onBeforeUnmount(()=>{
window.removeEventListener("click",savePoint)
})
return point;
}
第二步:引入自定义hook函数
import {ref } from 'vue';
import usePoint from '../hooks/usePoint'
export default {
name:"Demo",
setup() {
let sum = ref(0);
let point = usePoint();
//返回一个对象(常用)
return {
sum,
point
}
},
}
import {reactive,toRef,toRefs} from 'vue';
export default {
name:"Demo",
setup() {
let person = reactive({
name:"张三",
age:20,
job:{
j1:{
salary:3000
}
}
})
// const name1 = toRef(person,"name");
// console.log(name1);
const x = toRefs(person);
console.log(x);
let person = reactive({
name:"张三",
age:20,
job:{
j1:{
salary:3000
}
}
})
let sum = ref(0);
// person = readonly(person);
//person = shallowReadonly(person);//只考虑浅层的只读
sum = readonly(sum);
let person = reactive({
name:"张三",
age:20,
job:{
j1:{
salary:3000
}
}
})
function showRawPerson(){
//只能处理reactive的对象
const p = toRaw(person);
console.log(p);
}
function addCar(){
let car = {name:"奔驰",price:1000}
//不会变成响应式对象
person.car = markRaw(car);
}
<template>
<input type="text" v-model="keyword">
<h3>{{keyword}}</h3>
</template>
<script>
import {ref,customRef} from 'vue'
export default {
name:'Demo',
setup(){
// let keyword = ref('hello') //使用Vue准备好的内置ref
//自定义一个myRef
function myRef(value,delay){
let timer
//通过customRef去实现自定义
return customRef((track,trigger)=>{
return{
get(){
track() //告诉Vue这个value值是需要被“追踪”的
return value
},
set(newValue){
clearTimeout(timer)
timer = setTimeout(()=>{
value = newValue
trigger() //告诉Vue去更新界面
},delay)
}
}
})
}
let keyword = myRef('hello',500) //使用程序员自定义的ref
return {
keyword
}
}
}
</script>
setup(){
......
let car = reactive({name:'奔驰',price:'40万'})
provide('car',car)
......
}
2.后代组件中:
setup(props,context){
......
const car = inject('car')
return {car}
......
}
什么是Teleport?—— Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。to:移动的位置
<teleport to='body'>
<div v-if="isShow" class="mask">
<div class="dialog">
<h3>我是一个弹窗h3>
<h4>一些内容h4>
<h4>一些内容h4>
<h4>一些内容h4>
<button @click="isShow=false">关闭弹窗button>
div>
div>
teleport>
import {defineAsyncComponent} from 'vue'
const Child = defineAsyncComponent(()=>import('./components/Child.vue'))
<template>
<div class="app">
<h3>我是App组件h3>
<Suspense>
<template v-slot:default>
<Child/>
template>
<template v-slot:fallback>
<h3>加载中.....h3>
template>
Suspense>
div>
template>
Vue 2.x 有许多全局 API 和配置。
//注册全局组件
Vue.component('MyButton', {
data: () => ({
count: 0
}),
template: ''
})
//注册全局指令
Vue.directive('focus', {
inserted: el => el.focus()
}
Vue3.0中对这些API做出了调整:
Vue2.x写法
.v-enter,
.v-leave-to {
opacity: 0;
}
.v-leave,
.v-enter-to {
opacity: 1;
}
Vue3.x写法
.v-enter-from,
.v-leave-to {
opacity: 0;
}
.v-leave-from,
.v-enter-to {
opacity: 1;
}
父组件中绑定事件
<my-component
v-on:close="handleComponentEvent"
v-on:click="handleNativeClickEvent"
/>
子组件中声明自定义事件
<script>
export default {
emits: ['close']
}
</script