1 创建vue3项目
 
	- vue-cli:vue脚手架---》创建vue项目---》构建vue项目--》工具链
    	跟之前一样
    - vite :https://cn.vitejs.dev/
        -npm create vue@latest 
        // 或者
        -npm create vite@latest
        一路选择即可
        
        
 
	-vue-cli跟之前一样
    -vite 创建的:npm install   npm run dev
    
    
 
	-冷启动
    -热加载
    -按需编译
 
补充:链式调用
 
	对象.changeName('lin').printName().showAge()
    
	class Person:
        def changeName(self,name):
            self.name=name
            return self
        def printName(self):
            print(self.name)
            return self
            
 
2 setup函数
 
setup的两个注意点
在beforeCreate之前执行一次,this是undefined。
props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。
context:上下文对象
attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性, 相当于 this.$attrs。
slots: 收到的插槽内容, 相当于 this.$slots。
emit: 分发自定义事件的函数, 相当于 this.$emit。
    
    
    
	setup执行是在beforeCreate,没有this对象,以后不要用this了
    
	如果写setup函数,想接收父组件自定义属性传入的值,需要
        export default {
          setup(props) {
            console.log(props.msg)
          },
          props: ['msg']
        }
        
    如果是vue3的最新写法,想接收父组件自定义属性传入的值,需要
    <script setup>
    defineProps(['msg'])
    </script>
 
<template>
  <div class="home">
    <p>我的名字是:{{ name }}</p>
    <p>我的年龄是:{{ age }}</p>
    <button @click="handleClick">点我看信息</button>
  </div>
</template>
<script>
export default {
  setup() {
    
    const name = 'lqz'
    let age = 19
    
    
    const showInfo = () => {
      alert(`姓名是:${name},年龄是:${age}`)
    }
    return {name, age, showInfo}
  },
  
  
  
  
  
  
}
</script>
 
3 ref函数
 
<template>
  <div class="home">
    <p>我的名字是:{{ name }}</p>
    <p>我的年龄是:{{ age }}</p>
    <button @click="handleAdd">点我年龄+1</button>
    <button @click="handleChangeName">点我秒变彭于晏</button>
  </div>
</template>
<script>
import {ref} from 'vue'
export default {
  setup() {
    
    let name = ref('lin')
    let age = ref(19)
    
    
    const handleAdd = () => {
      age.value += 1
      console.log(typeof age)
    }
    const handleChangeName = () => {
      name.value = '彭于晏'
    }
    return {name, age, handleAdd,handleChangeName}
  }
}
</script>
 
4 reactive函数
 
<template>
  <div class="home">
    <p>我的名字是:{{ data.name }}</p>
    <p>我的年龄是:{{ data.age }}</p>
    <p>我的爱好是:{{ hobby }}</p>
    <button @click="addAge">点我年龄+1</button>
    <br>
    {{ obj.hobby }}
    <br>
    <button @click="changeHobby">点我把保龄球换成足球</button>
    <hr>
    <HelloWorld msg="asdfasdfasdfasdf"></HelloWorld>
  </div>
</template>
<script>
import {reactive, ref} from 'vue'
export default {
  setup(props) {
    let hobby = ref('篮球')
    let obj = ref({
      age: 99,
      hobby: '保龄球'
    })
    const changeHobby = () => {
      console.log(obj)
      obj.value.hobby = '足球'
    }
    let data = reactive({
      name: '彭于晏',
      age: 19
    })
    const addAge = () => {
      
      console.log(typeof data)
      console.log(data) 
      data.age++
    }
    return {hobby, data, addAge, obj, changeHobby}
    
  }
}
</script>
-------------------------------------------------------------------------
ref
作用: 定义一个响应式的数据
语法: const xxx = ref(initValue)
创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。
JS中操作数据: xxx.value
模板中读取数据: 不需要.value,直接:<div>{{xxx}}</div>
备注:
接收的数据可以是:基本类型(值类型)、也可以是对象(引用类型)类型。
reactive
作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
reactive定义的响应式数据是“深层次的”,无论套多少层,都具备响应式
# 总结:
  如果用基本数据类型:数字,字符串,布尔,用ref做响应式
  如果是对象类型,用ref和reactive都可以,但是建议使用reactive
  如果使用ref包裹对象类型,多了一层value
 
补充:element-plus
 
1.官网
	https://element-plus.org/
2.安装
	npm install element-plus --save
3.使用
	import { xxx } from 'element-plus'
 
5 计算和监听属性
 
<template>
  <div class="home">
    <input type="text" v-model="name.firstName">
    <input type="text" v-model="name.lastName">
    <br>
    <input type="text" v-model="fullName">
    <button @click="age++">点我年龄加</button>
  </div>
</template>
<script>
import {computed, watch, reactive, ref,watchEffect} from 'vue'
export default {
  name: 'HomeView',
  setup() {
    
    let name = reactive({
      firstName: 'lin',
      lastName: 'dj'
    })
    let fullName = computed({
      get() {
        return name.firstName + '-' + name.lastName
      },
      set(value) {
        const nameArr = value.split('-')
        name.firstName = nameArr[0]
        name.lastName = nameArr[1]
      }
    })
    let age = ref(19)
    
    
    watch(age, (newValue, oldValue) => {
      console.log(oldValue)
      console.log(newValue)
    })
    
    watch(() => name.firstName, (newValue, oldValue) => {
      console.log(oldValue)
      console.log(newValue)
    })
    
    watchEffect(() => {
      const x1 = age.value
      const x2 = name.firstName
      console.log('watchEffect配置的回调执行了')
    })
    return {name, fullName, age}
  }
}
</script>
 
6 生命周期
 
	-想把生命周期写下setup函数中
    	
    -把生命周期写在配置项中
        beforeDestroy改名为 beforeUnmount
        destroyed改名为 unmounted
        
        beforeCreate
        created
        beforeMount 
        mounted
        beforeUpdate
        updated
        beforeUnmount 
        unmounted
    	
 
<template>
  <div class="home">
	<h1>八个生命周期钩子</h1>
  </div>
</template>
<script>
import axios from 'axios'
import {
  ref,
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted
} from "vue";
export default {
  
  setup() {
    
    
    console.log('我是beforeCreate, 我和setup函数融合了')
    let name = ref('lin')
    
    console.log('我是Created, 我也和setup函数融合了')
    axios.get('http://localhost:8080/').then(res => {
      name.value = res.data.name
    })
    let t = setInterval(() => {
      console.log('lin')
    }, 3000)
    
    onBeforeMount(() => {
      console.log('挂载了')
    })
    
    onMounted(() => {
      console.log('挂载完成了')
    })
    
    onBeforeUpdate(() => {
      console.log('更新数据')
    })
    
    onUpdated(() => {
      console.log('数据更新完成')
    })
    
    onBeforeUnmount(() => {
      console.log('在组件卸载之前执行的操作')
      clearInterval(t)
      t = null
    })
    
    onUnmounted(() => {
      console.log('组件卸载完成')
    })
    return {}
  }
}
</script>
 
7 torefs的使用
 
<template>
  <div class="home">
    <h1>演示toRefs</h1>
    {{name}}是{{age}}岁了
  </div>
</template>
<script>
import {reactive, toRefs} from "vue";
export default {
  
  setup() {
    
    
    
    
    
    
    
    let data = reactive({
      name: 'lin',
      age: 20
    })
    return {...toRefs(data)}
  }
let data ={'name':'lin',age:19}
let dict={...data,hobby:'篮球'}
console.log(dict)
</script>
 
8 vue3 setup写法
 
<script setup>
定义变量
写函数
不用return,在html中直接使用
</script>
import HelloWorld from "../components/HelloWorld.vue";
在html中直接用:<HelloWorld msg="hello"></HelloWorld>
    <script setup>
    defineProps({
      msg: {
        type: String,
        required: true
      }
    })
    </script>
 
<template>
  <hello-world msg="hello"></hello-world>
  {{name}}
  <p><button @click="changeName">点我看是谁</button></p>
</template>
<script setup>
import HelloWorld from "../components/HelloWorld.vue"
import {ref} from 'vue'
let name = ref('lin')
let changeName = () => {
  name.value = '彭于晏'
}
</script>