vue3怎么在一个页面动态刷新视图,
使用响应式数据,
如果是用选项式API,将时间变量放在data()函数中,
如果是用vue3的组合式API,可以使用ref函数定义响应式数据
这不是微信小程序吗?
<div class="start" >{{currentTime}}</div>
在HTML也是这样定义的
...
<van-swipe-item v-for="item in state.musicList"
:key="item">
<router-link :to="{path:'/itemMusic',query:{id:item.id}}">
<!-- 利用musicList对展示进行循环赋值 -->
<img :src="item.picUrl"
alt="" />
<span class="playCount">
<svg class="icon"
aria-hidden="true">
<use xlink:href="#icon-24gl-play"></use>
</svg>
{{changeCount(item.playCount)}}
</span>
<span class="name">
{{item.name}}
</span>
</router-link>
</van-swipe-item>
</van-swipe>
...
因为加了路由链接所以歌单推荐字体变成蓝色,需要在App.vue中配置样式
a {
color: black;
}
针对这个问题,我们可以使用Vue3中的响应式数据和计算属性来实现视图的动态更新和数据的同步更新。
首先,在Vue3中,我们可以使用ref
和reactive
来创建响应式数据。在该问题中,我们需要动态更新当前歌曲的当前时间,我们可以使用ref
来创建一个响应式的变量来存储当前时间:
import { ref } from 'vue'
export default {
setup() {
const currentTime = ref(new Date().getTime())
// 此处省略其他代码 ...
return {
currentTime
}
}
}
然后,在页面中我们可以使用{{}}
来绑定变量,例如:
<div>{{ currentTime }}</div>
这样,如果我们更新了currentTime
变量的值,该部分视图就会自动更新。但是这种方式只能更新视图,如果我们需要将视图与数据同步更新,则需要使用计算属性。
在Vue3中,我们可以使用computed
函数来创建计算属性。在该问题中,我们需要将当前时间格式化为指定的时间格式,并与歌曲长度进行比较,来更新当前歌曲的进度条。我们可以这样实现:
import { ref, computed } from 'vue'
import { formatTime } from 'utils' // 工具函数,用于格式化时间
export default {
setup() {
const currentTime = ref(new Date().getTime())
const songDuration = ref(0)
// 此处省略其他代码 ...
const currentProgress = computed(() => {
const currentTimeFormatted = formatTime(currentTime.value, 'mm:ss')
const songDurationFormatted = formatTime(songDuration.value, 'mm:ss')
// 更新进度条代码
// ...
// 返回格式化后的时间
return `${currentTimeFormatted} / ${songDurationFormatted}`
})
return {
currentTime,
songDuration,
currentProgress
}
}
}
这样,我们就可以使用{{ currentProgress }}
来绑定当前歌曲的进度条,并且每当currentTime
和songDuration
发生变化时,该部分视图就会自动更新,并且currentProgress
的值也会更新。
需要注意的是,我们需要通过setInterval
或者requestAnimationFrame
等方法来定时更新当前时间的值,例如:
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { formatTime } from 'utils'
export default {
setup() {
const currentTime = ref(new Date().getTime())
const songDuration = ref(0)
// 此处省略其他代码 ...
const currentProgress = computed(() => {
const currentTimeFormatted = formatTime(currentTime.value, 'mm:ss')
const songDurationFormatted = formatTime(songDuration.value, 'mm:ss')
// 更新进度条代码
// ...
// 返回格式化后的时间
return `${currentTimeFormatted} / ${songDurationFormatted}`
})
let timer = null
onMounted(() => {
timer = setInterval(() => {
currentTime.value = new Date().getTime()
}, 1000)
})
onUnmounted(() => {
clearInterval(timer)
})
return {
currentTime,
songDuration,
currentProgress
}
}
}
至于视图没有自动更新的问题,可能是由于Vue3中的模板编译器使用了静态提升等技术,导致某些情况下无法自动更新视图。可以尝试使用手动触发更新视图的方法来解决,例如:
import { ref, watch, nextTick } from 'vue'
export default {
setup() {
const data = ref([])
// 此处省略其他代码 ...
watch(data, () => {
nextTick(() => {})
})
return {
data
}
}
}
在nextTick
回调函数中,可以不做任何操作,这样就可以手动触发更新视图了。