kirisaki
@kirisaki

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Vue.js 非リアクティブ変数が更新されている

解決したいこと

Vue3初学者です。
参考書内のソースを動かしていたところ、ref()ではない変数(timeStr)が画面上で更新されています。
「現在時刻(ref):」は毎秒更新され
「現在時刻:」は初期表示時の時刻が表示されて更新されない認識でした。

・なぜこのソースで「現在時刻:」が更新されるのか
上記の原因を知りたいのでご存じの方がいらっしゃれば教えてください。

該当するソースコード

<script setup lang="ts">
import { ref } from "vue";

const now = new Date();
const nowStr = now.toLocaleTimeString();
let timeStr = nowStr;
const timeStrRef = ref(nowStr);

function changeTime(): void {
    const newTime = new Date();
    const newTimeStr = newTime.toLocaleTimeString();
    timeStr = newTimeStr;
    timeStrRef.value = newTimeStr;
}

setInterval(changeTime, 1000);
</script>

<template>
    <p>現在時刻:{{ timeStr }}</p>
    <p>現在時刻(ref):{{ timeStrRef }}</p>
</template>
0

1Answer

簡単に説明するとtimeStrRefを変更したときに<template>内の{{ timeStrRef }}が部分的に更新されるわけではなく<template>内全体が更新(再レンダリング)されるからです。
<template>内全体が更新される際に{{ timeStr }}も再評価されるので同時に更新されているように見えます。
timeStrtimeStrRefの更新タイミングをずらしてみればわかりやすいです。

2Like

Comments

  1. @kirisaki

    Questioner

    回答ありがとうございます。
    めちゃくちゃわかりやすいです。
    勉強になりました。
    template全体を更新することを解説している文献を探してみます。

    また、今回の問題はおそらく参考書側の間違いだと思うので問い合わせてみます。

Your answer might help someone💌