provide inject在vue2和vue3中的使用

2022-07-15  本文已影响0人  踏雪_739a

vue2父组件

<template>
    <div>
        <input type="text" v-model="val" />
        <button @click="addClick(val)">添加</button>

        <ListItem></ListItem>

        <div v-for="item in lists" :key="item">
            <li>{{ item }}</li>
        </div>
    </div>
</template>

<script>
import ListItem from "@/components/ListItem";
import { computed } from "vue";
export default {
    components: {
        ListItem,
    },
    provide() {
        return {
            todoLength: computed(() => this.lists.length),
        };
    },
    data() {
        return {
            lists: [1, 2, 3],
            val: "",
        };
    },

    methods: {
        addClick(val) {
            this.lists.push(val);
        },
    },
};
</script>

vue2子组件

<template>
    <div>
        <div>todoLength{{ todoLength }}</div>
    </div>
</template>

<script>
export default {
    name: "ListItem",
    inject: ["todoLength"],
};
</script>

vue3父组件

<template>
    <div>
        <ul>
            <li v-for="(item, index) in lists" :key="index">{{ item }}</li>
        </ul>

        <TodoListStatistics2></TodoListStatistics2>
    </div>
</template>

<script>
import { ref, provide } from "vue";
import TodoListStatistics2 from "./TodoListStatistics2.vue";
export default {
    components: { TodoListStatistics2 },
    setup() {
        const lists = ref([1, 2, 3]);
        provide("listslen", lists);

        const addList = (val) => {
            lists.value.push(val);
        };
        provide("addList", addList);

        return {
            lists,
        };
    },
};
</script>

vue3子组件

<template>
    <div>
        <h3>lists的长度:{{ listslen.length }}</h3>
        <input type="text" v-model="val" />
        <button @click="addList(val)">添加</button>
    </div>
</template>

<script>
import { inject } from "vue";
export default {
    setup() {
        const listslen = inject("listslen");
        const addList = inject("addList");
        return { listslen, addList };
    },
    data() {
        return {
            val: "",
        };
    },
};
</script>

vue3官方详细使用provide inject地址:(https://v3.cn.vuejs.org/guide/composition-api-provide-inject.html#%E4%BD%BF%E7%94%A8-provide)

上一篇下一篇

猜你喜欢

热点阅读