vue3怎么在一个页面动态刷新视图,

vue3怎么在一个页面动态刷新视图,

img


如图,我想显示当前歌曲的当前时间,数据已经拿到并改变,但是视图没有更新

使用响应式数据,
如果是用选项式API,将时间变量放在data()函数中,
如果是用vue3的组合式API,可以使用ref函数定义响应式数据
这不是微信小程序吗?

img


不对啊我定义了

<div class="start" >{{currentTime}}</div>

在HTML也是这样定义的

  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:vue 移动端歌词实时滚动及优化
  • 除此之外, 这篇博客: vue3仿网易云移动应用中的 2.3.3 在首页歌单推荐栏的轮播图循环处添加路由跳转并携带参数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • ...
    <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;
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    针对这个问题,我们可以使用Vue3中的响应式数据和计算属性来实现视图的动态更新和数据的同步更新。

    首先,在Vue3中,我们可以使用refreactive来创建响应式数据。在该问题中,我们需要动态更新当前歌曲的当前时间,我们可以使用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 }}来绑定当前歌曲的进度条,并且每当currentTimesongDuration发生变化时,该部分视图就会自动更新,并且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回调函数中,可以不做任何操作,这样就可以手动触发更新视图了。