Vue3的setup函数以及ref和reactive方法的使用

    在vue3中,有个核心的东西,setup函数,它相当于一个新的生命周期,在beforeCreate 之前执行,在里面没有this

setup默认是非响应式的,即做点击事件修改num的值,模板上的num不会跟着变。

这时候需要用ref方法来让它变成响应式:

<template>
  <div>
    <div>Vue3中的setup函数</div>
    <div>{{ count }}</div>
    <div>
      <button @click="setCount(1)">添加</button>
    </div>
  </div>
</template>

<script>
//1.将ref函数从vue当中导入
import { ref } from "vue";
export default {
  //2.把一个值类型 进行ref封装
  setup() {
    const count = ref(0);
    //4.函数
    const setCount = (val) => {
      // 规定val的类型
      if (typeof val === "number") {
        console.log(count.value);
        count.value += val;
      } else {
        console.error("val必须是一个数字");
      }
    };
    //3.把想在外面进行渲染的数据,通过return导出
    return {
      count,
      setCount,
    };
  },
};
</script>

重点:setup中不能使用this,ref就是接收某些东西的内部值并返回一个可响应的ref对象,使用return把数据导出进行渲染

其实基于上面这种,我们还有种优化方案,就是把setup中的函数提取到外面抽离到外面进行封装,setup里只需进行一次解构,这样就大大减少了setup中的代码和整洁度

代码如下:

<template>
  <div>
    <div>{{ count }}</div>
    <div>
      <button @click="submit(1)">添加</button>
    </div>
  </div>
</template>

<script>
/*
    目标:学会在setup limian进行数据响应式操作
*/
//1.将ref函数从vue当中导入
import { ref } from "vue";
// initVal 初始值
const useCount = (initVal) => {
  //2.把一个值类型 进行ref的包装
  const count = ref(initVal);
  // 4.函数
  const submit = (val) => {
    if (typeof val === "number") {
      count.value += val;
    } else {
      console.error("val必须是一个数字");
    }
  };
  return [count, submit];
};
export default {
  setup() {
    const [count, submit] = useCount(0);
    // 3.把想在外面进行的渲染的数据,通过return导出
    return {
      count,
      submit,
    };
  },
};
</script>

<style>
</style>

toRef的使用:

什么是toRef:

    比如有这样的一种情况,一个对象里面的数据,有一部分是响应式的,有一部分是写死的

    这样就可以使用toRef可以把一个对象里面的属性变成响应式的数据

代码如下:

<template>
  <div>
    <div>ageRef:{{ ageRef }}</div>
  </div>
</template>

<script>
// 1.导入
import { reactive, toRef } from "vue";
export default {
  setup() {
    // 可以有这样的一种情况,一个对象里面的数据,有一部分是响应式的,有一部分是写死的
    //toRef可以把一个对象里面的属性变成响应式的数据
    const state = reactive({
      name: "狗蛋",
      age: 15,
    });
    const ageRef = toRef(state, "age");
    console.log(ageRef);
    setInterval(() => {
      ageRef.value++;
    }, 1000);
    return {
      ageRef,
      state,
    };
  },
};
</script>

<style>
</style>

以上代码中出现了一个新鲜词汇reactive,下面就详细介绍一下用法

 reactive方法 把对象里面的多个属性变成响应式数据

<template>
  <div>
    <div>name:{{ p.name }} age:{{ p.age }}</div>
    <div>
      <button @click="changeAge">累加</button>
    </div>
    <div>{{ count }}</div>
  </div>
</template>

<script>
/*
    目标:ref把值类型变成响应式对象
    再利用reactive方法 把对象里面的多个属性变成响应式数据
*/
// 1
import { reactive, ref } from "vue";
export default {
  setup() {
    //2.调用reactive方法进行数据的响应式处理
    const p = reactive({
      name: "花腔",
      age: 18,
    });
    console.log(p);
    const changeAge = () => {
      p.age++;
    };
    const count = ref(0);
    return {
      p,
      changeAge,
      count,
    };
  },
};
</script>

<style>
</style>

最后再介绍一种toRefs

一个state里面 可能键非常多 如果一个个的导出会比较麻烦,使用toRefs把一个响应式对象里面的每一个数据 都变成ref对象

<template>
  <div>
    <div>{{ a.age }}</div>
    <div>{{ b }}</div>
  </div>
</template>

<script>
//1.导入
import { reactive, toRefs } from "vue";
/*
    把一个state里面 可能键非常多 如果一个个的导出会比较麻烦
    使用toRefs把一个响应式对象里面的每一个数据 都变成ref对象
*/
export default {
  setup() {
    const state = reactive({
      a: {
        age: 13,
      },
      b: 10,
      c: 20,
      d: 30,
    });
    setInterval(() => {
      state.b++;
    }, 1000);
    return {
      // 如果直接使用结构会导致响应式特性失效
      //   ...state,
      ...toRefs(state),
    };
  },
};
</script>

<style>
</style>

如果有什么不了解的地方可留言,如果觉得小编文章做得不好不全,小编一定会进行改进,谢谢!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!感谢您的提问。关于 vue2.6.12 版本的使用问题,下面是详细的回答: 1. 使用 refVue2 中,通过 ref() 函数可以获取 DOM 元素或组件实例的引用。具体使用方法如下: ``` <template> <div ref="myDiv">这是一个 div 元素</div> </template> <script> export default { mounted() { console.log(this.$refs.myDiv); // 输出获取到的 DOM 元素 } } </script> ``` 上述代码中,我们在模板中使用 ref 将一个 div 元素的引用命名为“myDiv”,然后在 mounted 生命周期钩子中通过 this.$refs.myDiv 获取到该元素的引用。 2. 使用 reactiveVue2 中,通过 reactive() 函数可以将一个普通对象转换为响应式对象,并进行数据劫持。具体使用方法如下: ``` <script> import { reactive } from 'vue'; export default { setup() { const state = reactive({ count: 0 }); function increment() { state.count++; } return { state, increment }; } } </script> ``` 上述代码中,我们在 setup 函数使用 reactive 将一个普通对象转换为响应式对象,并返回了两个属性:state 和 increment。在组件中可以通过 state.count 访问 count 属性,通过 increment 函数进行修改。 3. 使用 onMounted 在 Vue2 中,通过 onMounted() 生命周期函数可以在组件挂载后执行一些操作。具体使用方法如下: ``` <script> import { onMounted } from 'vue'; export default { setup() { onMounted(() => { console.log('组件挂载完成!'); }); return {}; } } </script> ``` 上述代码中,我们在 setup 函数使用 onMounted 函数定义一个组件挂载后要执行的操作——输出一句话“组件挂载完成!”。这样就可以在组件挂载后自动执行这段代码了。 希望以上回答对您有帮助!如果您还有其他问题,可以继续提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值