データ渡し(簡素化)

Provide / Injectは、
親コンポーネントが子コンポーネントにデータや機能を供給し、子コンポーネントがそれを受け取る仕組みです。

データ渡し(簡素化)
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Provide / Injectについて</title>
  <link rel="stylesheet" href="./main.css" />
</head>
<body>
  <div id="app"></div>

  <!-- CDN -->
  <script src="CDNのURL"></script>
  <script src="./main.js"></script>
</body>
</html>
// 親コンポーネントの作成
Vue.createApp({
  setup() {
    // リアクティブなデータを提供
    const sharedData = Vue.reactive({
      message: "これは共有されたリアクティブデータです",
    });
    Vue.provide("sharedData", sharedData);

    return { sharedData };
  },
  template: `
    <div class="container">
      <div class="title">Provide / Injectの例</div>
      <parent-component></parent-component>
      <div class="label">【親コンポーネントのデータ】</div>
      <div class="message">{{ sharedData.message }}</div>
    </div>
  `,
})
  // 子コンポーネントの作成
  .component("parent-component", {
    template: `
    <div>
      <child-component></child-component>
    </div>
  `,
  })
  // 孫コンポーネントの作成
  .component("child-component", {
    template: `
    <div>
      <grandchild-component></grandchild-component>
    </div>
  `,
  })
  // ひ孫コンポーネントの作成
  .component("grandchild-component", {
    setup() {
      // リアクティブなデータを注入
      const sharedData = Vue.inject("sharedData");
      return { sharedData };
    },
    template: `
    <div class="child-container">
      <input v-model="sharedData.message" placeholder="メッセージを変更" class="input">
      <div class="label">【孫コンポーネントで注入されたデータ】</div>
      <div class="child-message">{{ sharedData.message }}</div>
    </div>
  `,
  })
  .mount("#app");
.container {
  max-width: 600px;
  margin: 0 auto;
  padding: 20px;
  text-align: center;
  background-color: #f7f7f7;
  border-radius: 8px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.title {
  font-size: 2em;
  margin-bottom: 20px;
  line-height: 1.5;
  color: #333;
}
.label {
  font-weight: bold;
  margin-top: 20px;
  line-height: 1.8;
  color: #333;
}
.message {
  font-size: 1.2em;
  margin-top: 10px;
  line-height: 1.8;
  color: #333;
}
.child-container {
  margin-top: 20px;
}
.input {
  padding: 10px;
  font-size: 1em;
  width: 80%;
  border: 1px solid #ccc;
  border-radius: 4px;
  margin-bottom: 10px;
  line-height: 1.8;
}
.child-message {
  font-size: 1.1em;
  color: #555;
  line-height: 1.8;
}
出力結果