文字列のリストを循環し、見出しのテキストを値に置き換える単純なコンポーネント (SFC) を作成しています。
構造とデザインが好きなので、すべてのコンポーネントに合成 API を使用する予定です。
コンポーネントを正しく作成したと思っていましたが、DOM で自動更新されません。
ログは値の更新を正しく示していますが、setup() が最初に呼び出された後、値は変更されません。
コンポジション API スタイル (DOM を更新しません):
<template>
<div>
<h1>{{ text }}</h1>
</div>
</template>
<script>
import { ref } from "@vue/composition-api";
export default {
props: {
textList: Array,
interval: Number
},
setup(props) {
let text = ref(props.textList[0]);
let cycler;
function startCycling() {
let index = 0;
text = props.textList[index];
cycler = setInterval(() => {
if (index >= props.textList.length) {
index = 0;
}
console.log("Index: " + index);
text = props.textList[index];
console.log("Text: " + text);
index++;
}, props.interval);
}
function stopCycling() {
clearInterval(cycler);
}
startCycling();
return { text, startCycling, stopCycling };
}
};
</script>
コード ロジックを間違えたのではないかと思ったので、Options API を使用して同じコンポーネントを作成したところ、すぐに機能しました。
オプション API スタイル (動作):
export default {
props: {
textList: Array,
interval: Number
},
data() {
return {
text: "",
};
},
methods: {
startCycling: function() {
let index = 0;
this.text = this.$props.textList[index];
cycler = setInterval(() => {
if (index >= this.$props.textList.length) {
index = 0;
}
console.log("Index: " + index);
this.text = this.$props.textList[index];
console.log("Text: " + this.text);
index++;
}, this.$props.interval);
},
stopCyling: function() {
clearInterval(cycler);
},
},
mounted() {
this.startCycling();
},
}
Vue の新しいコンポジション API でこの機能を複製するにはどうすればよいですか?
text
コードで変更して反応性を維持できるようにするには、何をする必要がありますか? これを単に使用ref(text)
して返すだけでは、これは行われないようです。