03 vue3 setup ref

setup的使用

ref

ref的使用
<template>
    <h1>{{count}}</h1>
    <button @click="myFn()">按钮</button>
</template>

<script>
    import {ref} from 'vue';

    export default {
        name: "App",
        // setup函数是组合API的入口函数
        setup() {
            // 定义了一个名称叫做account变量,这个变量的初始值是0
            // 这个变量发生变化之后,Vue会自动更新UI
            let count = ref(0);

            // 在组合API中,如果想定义方法,不用定义到methods中,直接定义即可
            function myFn() {
                // alert(123);
                count.value += 1;
            }
            // 注意点:
            // 再组合API中定义的变量/方法,要想在外界使用,必须通过 return {xxx, xxx} 暴漏出去
            return {count, myFn}
        }
    }

</script>
ref注意点

1.什么是ref?

  • ref和reactive一样,也是用来实现响应式数据的方法
  • 由于reactive必须传递一个对象,所以导致在企业开发中如果我们只想让某个变量实现响应式的时候会非常麻烦所以Vue3就给我们提供了ref方法,实现对简单指的监听

2.ref本质:

  • ref底层的本质其实还是reactive,系统会自动根据给ref传入的值将它转换成
  • ref(xx) -> reactive({value: xx})

3.ref注意点:

  • 在Vue中使用ref的值不用通过value获取
  • 在JS中使用ref的值必须通过value获取

reactive

reactive的使用
<template>
    <ul>
        <li v-for="(stu, index) in state.stus" :key="index">
            {{stu.name}} -> {{stu.age}}
        </li>
    </ul>
</template>

<script>
    import {reactive} from 'vue';

    export default {
        name: "App",
        // setup函数是组合API的入口函数
        setup() {
            // ref 函数注意点:
            // ref函数只能监听简单类型的变化,不能监听复杂类型的变化(对象/数组)
            let state = reactive({
                stus: [
                    {id: 1, name: 'zs', age: 10},
                    {id: 2, name: 'ls', age: 20},
                    {id: 3, name: 'ww', age: 30},
                ]
            });

            return {state}
        }
    }
</script>
reactive注意点

1. 什么是reactive:

  • reactive是Vue3中提供的实现响应式数据的方法
  • 在Vue2中响应式数据是通过defineProperty来实现的,而在Vue3中响应式数据是通过ES6的Proxy来实现的

2. reactive注意点:

  • reactive参数必须是对象(json/arr)
  • 如果给reactive传递了其它对象
    • 默认情况下修改对象,界面不会自动更新
    • 如果想更新,可以通过重新复制的方式

引入func

<template>
    <form>
        <input type="text" v-model="state02.stus.id">
        <input type="text" v-model="state02.stus.name">
        <input type="text" v-model="state02.stus.age">
        <input type="submit" @click="addStu($event)">
    </form>
    <ul>
        <li v-for="(stu, index) in state.stus" :key="index" @click="removeStu(index)">
            {{stu.name}} -> {{stu.age}}

        </li>
    </ul>
</template>

<script>
    import useRemoveStu from './remove';
    import useAddStu from './add';

    export default {
        name: "App",
        // setup函数是组合API的入口函数
        setup() {
            // ref 函数注意点:
            // ref函数只能监听简单类型的变化,不能监听复杂类型的变化(对象/数组)
            let {state, removeStu} = useRemoveStu();
            let {state02, addStu} = useAddStu(state);
            return {state, removeStu, state02, addStu}
        }
    }

</script>
remove.js
import {reactive} from "vue";

function useRemoveStu() {
    // ref 函数注意点:
    // ref函数只能监听简单类型的变化,不能监听复杂类型的变化(对象/数组)
    let state = reactive({
        stus: [
            {id: 1, name: 'zs', age: 10},
            {id: 2, name: 'ls', age: 20},
            {id: 3, name: 'ww', age: 30},
        ]
    });

    function removeStu(index) {
        state.stus = state.stus.filter((stu, idx) => idx !== index);
    }

    return {state, removeStu}
}
export default useRemoveStu;

setup执行时机

  • beforeCreate:表示组件刚刚被创建出来,组件的data和methods还没初始化
  • Created:表示组件刚刚被创建出来,并且组件的data和methods已经初始化好

setup注意点

  • 由于在执行setup函数的时候,还灭有执行Created生命周期方法,所以在setup函数中,是无法使用data和methods
  • 由于我们不能在setup函数中使用data和methods,所以Vue为了避免我们错误的使用,它直接将setup函数中this修改成了undefined
  • setup函数只能是同步的不能是异步的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值