• Vue——ref/reactive、toRefs、计算属性、监视、Vue3响应式原理、Vue3生命周期


    ref/reactive

    ref函数创建单个数据的响应式对象

     ref函数可以把数据创建成为ref对象,只要是ref对象,那么就一定是响应式

     ref创建单个值的响应式对象

     ref对象,在模板用的时候会自动拿value,不需要你去.value

     ref对象,在js当中修改的时候,需要.value

    1. <script lang="ts">
    2. import { defineComponent } from "vue";
    3. export default defineComponent({
    4. name: "About",
    5. });
    6. script>
    7. <script lang="ts" setup>
    8. import { ref } from "vue";
    9. let msg = ref('我是哈哈哈');
    10. function update() {
    11. msg.value = '我成为了嘿嘿嘿';
    12. }
    13. script>

    ref传递对象

    如果使用ref传递一个对象,本质内部也是在使用reactive

    ref传递对象,那么返回的仍然是ref对象,它的value是代理对象

    1. <script lang="ts">
    2. import { defineComponent } from "vue";
    3. export default defineComponent({
    4. name: "About",
    5. });
    6. script>
    7. <script lang="ts" setup>
    8. import { ref } from "vue";
    9. const state = ref({
    10. name: '啊哈',
    11. hobby: '诶嘿'
    12. })
    13. function update(){
    14. state.value.name = '1111'
    15. }
    16. script>

    reactive

    reactive是用来对一个对象创建代理对象,代理对象也是响应式的

    reactive创建的代理对象,直接通过.语法去操作,不需要.value

    不能传递非对象数据

    1. <script lang="ts">
    2. import { defineComponent } from "vue";
    3. export default defineComponent({
    4. name: "About",
    5. });
    6. script>
    7. <script lang="ts" setup>
    8. import { reactive } from "vue";
    9. let msg = reactive({
    10. name: '我是哈哈哈'
    11. });
    12. function update() {
    13. msg.name = '我成为了嘿嘿嘿';
    14. }
    15. script>

    toRefs

    默认代理对象被解构,数据将失去响应能力

    如果非要去解构,并且保证响应能力依然存在,需要使用toRefs方法

    把state内部所有的属性全部转化为ref对象

    解构出来不再是基本值,而是ref对象,就有响应式能力

    1. <script lang="ts">
    2. import { defineComponent, reactive } from "vue";
    3. export default defineComponent({
    4. name: "About",
    5. });
    6. script>
    7. <script lang="ts" setup>
    8. import { ref, toRefs } from "vue";
    9. const state = reactive({
    10. name: '啊哈',
    11. hobby: '诶嘿'
    12. })
    13. let result = toRefs(state)
    14. console.log(result);
    15. let {name, hobby} = result
    16. console.log(name, hobby);
    17. function update(){
    18. state.name = '1111',
    19. state.hobby = '2222'
    20. }
    21. console.log(state);
    22. script>

    计算属性