video动态绑定src未触发vue的渲染

来源:8-7 文件上传组件的使用

纳兰汐枫

2020-05-07

1. 问题

视频上传成功后,对section.video赋值,未触发视频标签的显示,需要手动更改一下其他的表单值,视频才会刷新出来。

但看老师的视频,只要上传成功,为section.video赋值后,视频是立即自动加载出来的。不知这属于什么情况,该怎样处理呢?

2. 相关版本

  • @vue/cli 4.3.1
  • Chrome版本 80.0.3987.149(正式版本) (64 位)
  • Firefox 75
    两个浏览器均存在该问题。

3. 相关代码:

3.1 section.vue

3.1.1 html

<!-- ... -->
<div class="form-group">
	<label   class="col-sm-2 control-label">视频</label>
	<div class="col-sm-10"> 
		<file v-bind:input-id="'video-upload'" v-bind:text="'上传大视频'"  
				v-bind:suffixs="['mp4']" 
                v-bind:use="FILE_USE.COURSE.key"
                v-bind:after-upload="afterUpload">
         </file>
         <div v-show="section.video"  class="row">
	         <div class="col-md-9">
	         <video  v-bind:src="section.video"  id="video"  controls="controls"></video>
             </div>
         </div>
	</div>
</div>
<!-- ... -->

3.1.2 JS

// ...
 data: function() {
            return {
                section: {},
                sections: [],
                SECTION_CHARGE: SECTION_CHARGE,
                course: {},
                chapter: {},
                FILE_USE: FILE_USE,
            }
},
// ...
  afterUpload(resp) {
      let _this = this;
      console.log("_this", _this);
      let video = process.env.VUE_APP_FILE_SERVER + resp.content.path;
      _this.section.video =  video; 
      console.log(" _this.section.video", _this.section.video);
      _this.getTime();
  },
  getTime() {
      let _this = this;
      let ele = document.getElementById("video");

       console.log("ele",ele);
      _this.section.time = parseInt(ele.duration, 10);
  },

3.2 file.vue

 uploadFile() {
 // ...
   _this.$ajax.post(process.env.VUE_APP_SERVER + "/file/admin/upload", formData).then((res)=> {
      Loading.hide();
      let resp = res.data;
      console.log("文件上传的结果:", resp);
      _this.afterUpload(resp);
      $("#" + _this.inputId + "-input").val("");
  });
 // ...
}

4. 相关图片

4.1 动图演示

动图演示

4.2 静图说明

与动图不是同一次上传截取,打印出来的地址不同,仅用作说明
图片描述
图片描述

写回答

1回答

甲蛙

2020-05-07

这个问题有个别同学也有反馈,值有了,但是没有渲染到界面上。

这个问题常见于前端框架+jquery插件一起使用时。比如vue或angular框架中使用了jquery日期插件或树型插件或其它插件,就会出现这种赋值了,但是界面没体现出来。不排除有其它原因也会出现这种情况。

可以用这个方法解决:把这句_this.section.video=video换成_this.$set(_this.section, 'video', video)

1
1
纳兰汐枫
谢谢老师,用这种方式解决了
2020-05-07
共1条回复

Spring Cloud+ Vue前后端分离开发企业级在线视频系统

全网稀缺课程 市场热门项目+主流框架 一课掌握前后端技术

1743 学习 · 1697 问题

查看课程