如何在 vue js 3 中将数据从组件传递到远组件

How to pass data from a component to far component in vue js 3

我找不到将数据从组件传递到 vue 中的非 child 组件的方法。 我正在处理一个 blade 文件,我有一个组件可以在暗模式和亮模式之间切换。我希望我的深色徽标显示深色和浅色徽标以显示浅色。问题是 provide/inject 无法解决我在 Vue 开发工具中看到的问题,即提供了我的值,但是当我检查其他组件时,注入的值未定义。我之前在下拉组件中做过,我能够传递值,因为它是关于一个 parent 组件及其 child 但现在我不能这样做。

我需要一种方法将数据从 Switchdark.vue 组件传递到 Svglogodark.vue 组件。

我的Switchdark.vue

<template>
    <div
        class="flex cursor-pointer items-center justify-between"
        @click="modeToggle"
    >
        <div
            class="flex h-4 w-12 items-center rounded-full bg-gray-300 p-1 duration-300 ease-in-out"
            :class="{ 'bg-green-400': toggleActive }"
        >
            <div
                class="h-3 w-3 transform rounded-full bg-white shadow-md duration-300 ease-in-out"
                :class="{ 'translate-x-7': toggleActive }"
            ></div>
        </div>
    </div>
</template>

<script>
import { provide, ref } from "vue";
import Svglogodark from "./Svglogodark.vue";
export default {
    components: [Svglogodark],
    props: ["theme"],
    data() {
        return {
            toggleActive: false,
        };
    },
    mounted() {
        if (this.theme === "false") {
            this.light();
        } else {
            this.dark();
        }
    },
    methods: {
        dark() {
            document.querySelector("body").classList.add("dark");
            this.toggleActive = true;
            this.$emit("dark");
        },
        light() {
            document.querySelector("body").classList.remove("dark");
            this.toggleActive = false;
            this.$emit("light");
        },

        modeToggle() {
            if (
                this.darkMode ||
                document.querySelector("body").classList.contains("dark")
            ) {
                this.light();
            } else {
                this.dark();
            }
            const isDarkModeOn = this.toggleActive;
            createCookie("isDarkModeOn", isDarkModeOn.toString(), 60 * 60 * 24);
        },
    },
    setup() {
        const toggleActive = ref(toggleActive);

        provide("toggleActive", toggleActive);

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

<style></style>

我的Svglogodark.vue:

<template>
    <svg
        v-if="toggleActive"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink"
        width="170"
        height="70"
        viewBox="0 0 4792 1625"
    >
  
    </svg>
</template>

<script>
export default {
    inject: ["toggleActive"],
    created() {
        console.log(this.toggleActive);
    },
};
</script>

<style></style>

我将有两个 SVG,我希望它们显示我是否处于黑暗模式。

这里使用vuex你可以了解一下。 vuex-docs

或者

你可以使用简单的方法LocalStorage

\store item
localStorage.setItem('theme', 'dark');

\you can get anywhere
var theme = localStorage.getItem('theme');

console.log(theme); //'dark'