
大海贼时代结束!!!
vue3开始!!!
setup初体验
1.与vue2不同的是 定义的变量和方法都被放到一个叫 setup( )里面了
2.vue2里面没有了 this
3. 1)访问变量先定义
const msg = '1'2)然后在return里面返回 变量名
3)在template 中进行渲染
4.案例demo
<template>
  <h2>{{ msg }}</h2>
  <button @click="btn">点一下</button>
</template>
<script>
export default {
  setup() {
    const msg = '1'
    const btn = () => {
      console.log("ss")
    }
    return {
      msg,
      btn
    }
  }
}
</script>serup语法糖
1.在script 加setup(语法糖) 这样就可以不用先定义变量,在返回,在使用了
2.直接就可以下面定义,上面调用了
3.在引入模块和js文件时,记得一定要加上后缀名.vue,
<template>
  <h1>{{ msg }}</h1>
  <button @click="appDate">点击出现js文件的内容</button>
  <hello></hello>
</template>
<script setup>
import { appDate } from './appDate.js'
// 一个模块
import hello from './components/hello.vue'
const msg = "标题"
</script>ref 的使用
1.在setup里面定义的变量,对其不可以直接进行修改,需要先ref的处理
2.1)先引入 import { ref } from 'vue'
2)ref使用就是将值包起来,会生成一个 refimpl对象
    let num = ref(0)
    let str = ref("原字符串")3)操作数据需要加上 变量名.value才可以访问到对象里面的值
4)如果变量是一个对象也同理,需要变量名.value.具体的名字
3.总结demo
<template>
  <h1>薪资{{ num }}</h1>
  <button @click="add">点击加薪</button>
  <h1>姓名:{{ object.name }}</h1>
  <h1>年龄:{{ object.age }}</h1>
  <button @click="objectData">点击修改个人信息</button>
</template>
<script>
// 引入ref
import { ref } from 'vue';
export default {
  setup() {
    // ref的基础用法 
    // 1.先引入 import
    // 2.ref(0) 将值修改成refimpl对象
    // 3.访问对象里面的value
    // 定义一个薪资值
    let num = ref(10)
    let add = () => {
      num.value += 1000
    }
    // 对象形式的定义一个对象
    let object = ref({
      name: "张三",
      age: 32
    })
    // 对对象进行修改   一定要  .value来获取对象里面的值
    let objectData = () => {
      object.value.name = "王五",
        object.value.age = "30"
    }
    return {
      // 返回用到的变量名和方法名
      num,
      add,
      object,
      objectData
    }
  }
}
</script>reactive 修饰复杂的类型
1.不可以定义基本类型只可以定义引用类型
2.可以将一个数组直接放到 reactive
    let object = reactive({
      name: "张三",
      age: 32
    })3.return 返回只需要返回数组的名字
    return {
      // 返回用到的变量名和方法名
      object,
      objectData
    }4.在上面定义的引用插值表达时需要指定要变量名
<template>
  <h1>姓名:{{ object.name }}</h1>
  <h1>年龄:{{ object.age }}</h1>
  <button @click="objectData">点击修改个人信息</button>
</template>5总体的demo
<template>
  <h1>姓名:{{ object.name }}</h1>
  <h1>年龄:{{ object.age }}</h1>
  <button @click="objectData">点击修改个人信息</button>
</template>
<script>
// 引入ref
import { reactive, ref } from 'vue';
export default {
  setup() {
    // reactive 修饰复杂的类型
    // 不可以定义基本类型只可以定义引用类型
    let object = reactive({
      name: "张三",
      age: 32
    })
    // reactive 不需要加value
    let objectData = () => {
      object.name = "王五",
        object.age = "30"
    }
    return {
      // 返回用到的变量名和方法名
      object,
      objectData
    }
  }
}
</script>toRef与toRefs 的不同
1.
重新航海!!!
Vue2选项式Api Vue3组合式Api
<template>
  <h4> {{ name }} </h4>
</template>
<script>
export default {
  setup() {
    // 注册变量
    let name = "张三"
    // 导出
    return {
      name
    }
  }
}
</script>ref的使用
1.定义一个响应式的数据
<template>
  <h4> {{ name }} </h4>
  <button @click="updateName">修改name</button>
</template>
<script>
import { ref } from 'vue'
export default {
  setup() {
    // 注册变量
    let name = ref("张三")
    const updateName = () => {
      console.log(name);
      name.value = '张四'
    }
    // 导出
    return {
      name,
      updateName
    }
  }
}
</script>reactive的案例使用 定义对象类型的响应式数据
<template>
  <div>
    姓名:{{ counts.name }} <br />
    年龄:{{ counts.age }}<br />
    爱好:{{ counts.hoopy }}<br />
    喜欢:{{ counts.like }}<br />
  </div>
  <button @click="updateworld">魔法</button>
</template>
<script>
import { reactive } from 'vue'
export default {
  setup() {
    let counts = reactive({
      name: "小明",
      age: 10,
      hoopy: ['乒乓球', '篮球', '足球'],
      like: {
        name: "篮球",
        time: "10年"
      }
    })
    const updateworld = () => {
      counts.name = '小用'
      counts.age = 23
      counts.hoopy[2] = "橄榄球"
      counts.like.name = "橄榄球",
        counts.like.time = "30年"
    }
    // 导出
    return {
      counts,
      updateworld
    }
  }
}
</script>vue2的拦截方式的缺陷
Vue2的
对象中新增一个属性 和删除一个 属性 Object.defineProperty 拦截不到出现 (数据修改了,页面不变) 曲线救国
新增属性让Vue拦截到 this.person (对象名)
- 一个属性this.$set( this.person , ' 属性名字 ' , ' 添加的元素 ')
- 引入 Vue实例 通过Vue.set( this.person , 'sex' , ' 女 ' )
删除属性让Vue拦截到
- this.$delete(this.person , ' 删除的属性名 ')
- Vue.delete(this.person , ' 删除的属性名 ')
Vue3的 数据双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let person = {
            name: "张三",
            age: 23
        }
        // Proxy 代理 拦截对象 
        // Reflect 反射 对数据进行操作
        const p = new Proxy(person, {
            /**
             * 第一个参数 Proxy 化的person对象
             * 第二个参数 propName 修改的那个属性
             * */
            get(target, propName) {
                console.log("get读取到了");
                return Reflect.get(target, propName)
            },
            // value  修改的值
            set(target, propName, value) {
                console.log("set修改了");
                Reflect.set(target.propName, value)
            },
            deleteProperty(target, propName) {
                console.log("数据删除了经过了");
                return Reflect.deleteProperty(target, propName)
            }
        })
    </script>
</body>
</html>Vue3 和 Vue2 的区别
- setup 比 beforeCreate () 执行的还早 , setup里面取不到 this 事 undefined
- Vue2中props 传值 可以不接收在 this.$attrs里面获取 Vue3 不接收会发出警告,必须用props接收 在setup第一个参数中获取到值
- Vue3中的自定义事件子传父 Vue3中必须要用 emits 接收在setup 的第二个参数 context.emit(' ')中获取
- Vue3中 setup的第二个参数 里面  
  - attrs:父组件传递过来的参数,不接收到这里面了
- emit:父组件自定义的方法
- slots:父组件在组件插槽中插入的dom元素
 
- 组件的传值和自定义事件的使用和插槽 // 组件传值接收 props: ['personName', 'personAge'], // 自定义方法接收 emits: ['hello'], // 插槽 <template v-slot:school> <h1>尚硅谷school</h1> </template> // 插槽使用 <slot name="school"></slot>
- 计算属性 <template> <h1>计算属性</h1> <input type="text" v-model="person.firstName"> <br> <input type="text" v-model="person.lastName"> <br> <input type="text" v-model="person.sumName"> </template> <script> import { computed, reactive } from 'vue' export default { setup() { let person = reactive({ firstName: "张", lastName: "三" }) // 计算属性的渐变方法 不能修改 // person.sumName = computed(() => { // return person.firstName + "-" + person.lastName // }) // 计算属性 可以修改 person.sumName = computed({ get() { return person.firstName + '-' + person.lastName }, set(value) { //修改的值 let sumValue = value.split('-') // 转化成字符串 // console.log(sumValue); person.firstName = sumValue[0] person.lastName = sumValue[1] } }) return { person } } } </script>
- 监视属性 
  - Vue2的监视属性 watch: { // 简易版的: // numberOne(newValue, oldValue) { // console.log("数据", newValue, oldValue); // } numberOne: { handler(newValue, oldValue) { console.log("监听到了", newValue, oldValue); }, deep: true, immediate: true } },
- Vue3的监听 Vue3的监听是一个函数的形式 // 监听单个 第一种 watch(numberOne, (newValue, oldValue) => { console.log("监听的值:", newValue, oldValue); }) // 监听多个 第二种 watch([StringTwo, numberOne], (newValue, oldValue) => { console.log("监听的值:", newValue, oldValue); }) // 监听reatvie 属性的对象 /** * oldValue失效 * deep: false 失效 * */ // watch(person, (newValue, oldValue) => { // console.log("监听的值", newValue, oldValue); // }, { // deep: false // }) // 监听reactive 的一个属性 第一个参数设置函数 第三种 // watch(() => person.name, (newValue, oldValue) => { // console.log("监听的值:", newValue, oldValue); // }) // 监听reactive 的多个属性 第四种 // watch([() => person.name, () => person.age], (newValue, oldValue) => { // console.log("监听的值:", newValue, oldValue); // })
- watchEffect 函数  
    - 非惰性的,首页刷新执行!
- 全都监视 用谁监视谁 使用场景 只要发生修改watchEffect 的代码就执行。
 
 
- Vue2的监视属性 
- 生命周期函数讲 
  - 销毁前(beforeDestroy )和( destroyed ) 销毁 修改成了 卸载前( beforeUnmount ),已卸载( unmounted )
 
-  reactive, ref, shallowReactive, shallowRef -  /** * const person = reactive({ // 深层响应式 * const person = shallowReactive({ // 浅层响应式 * const person = ref({ // 可以对对象响应式 * const person = shallowRef({ // 限制ref能对对象的响应式 * */
 
-  
-  , toRef, toRefs -  return { obj, ...toRefs(person) // 导出整个对象 // name: toRef(person, 'name'), // 导出单个 // Hname: toRef(person.hoopy, "Hname") // 导出单个 }
 
-  
![[架构之路-196] - 发现问题原因的通常步骤:提出问题、明确问题、偏差分析、因素分析、原因分析](https://img-blog.csdnimg.cn/img_convert/f7efe2bf33776de3a2e3b4fffb5ec56b.jpeg)




![05- redis集群模式搭建(上) (包含云服务器[填坑])](https://img-blog.csdnimg.cn/9f6f10ec1a8c4c2385205c9f4cbd4039.png)













