父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法


Posted in Javascript onApril 25, 2018

场景:

我实际用到的是这样的,我父组件引用子组件related,父组件调用获取页面详情的方法,更新了state值related,子组件根据该related来渲染相关新闻内容,但是页面打开的时候总是先加载子组件,子组件在渲染的时候还没有获取到更新之后的related值,即使在子组件中watch该值的变化依然不能渲染出来子组件的相关新闻内容。

我的解决办法:

父组件像子组件传值,当父组件执行了获取页面详情的方法之后,state值related更新,然后传给子组件,子组件再进行渲染,可以正常获取到。

父组件代码:

<template>
 <div id="newsDetails">
  <mt-header title="详情">
   <router-link to="/" slot="left">
    <mt-button icon="back"></mt-button>
   </router-link>
  </mt-header>
  <div class="details clearfloat">
   <h1 class="titleFont">
    {{ title }}
   </h1>
   <div class="clearfloat sourceWrap">
    <ul class="sourceFont">
     <li v-if="(pubNews==true)">
      <span class="source">{{pubName}}</span>
     </li>
     <li>
      <span class="authorName">{{authorName}}</span>
      <span class="time">{{createAt|formatTime}}</span>
     </li>
    </ul>
    <span v-if="(pubNews==true)" class='btnFollow' @click="follow">关注</span>
   </div>
   <div class="bodyFont clearfloat" id="bodyFont" ref="bodyFont" :class="{bodyHeight:contentStatus}">
    <div v-html="content"></div>
    <div class="editor" v-if="editorName">责任编辑:{{editorName}}</div>
   </div>
   <div class="contentToggle" @click="contentStatus=!contentStatus" v-if="contentStatus">阅读全文</div>
   <Related :related="related"></Related>

<!--重点是这里 父组件向子组件传值-->
 </div> </div> </template>

import { Toast } from 'mint-ui';
 import {mapState} from 'vuex'
 import Related from './Related.vue'
 import moment from 'moment';
 export default{
  name:"NewsDetails",
  components:{
   Related,
  },
  data(){
   return {
    id:this.$route.params.id,
    topicType:"news",
    contentStatus:false,
    curHeight:0,
    bodyHeight:5000,
    hotCommentScrollTop:0
   }
  },
  created(){
   this.id=this.$route.params.id;
   this.fetchData();
   moment.locale('zh-cn');
  },
  mounted(){
   setTimeout(()=>{
    this.contentToggle();
   },500)
  },
  watch: {
   '$route'(to,from){
    this.id=this.$route.params.id;
    this.fetchData();
   }
  },
  computed: {
   ...mapState({
    title: state => state.newsDetails.title,
    authorName: state => state.newsDetails.authorName,
    pubNews: state => state.newsDetails.pubNews,
    pubName: state => state.newsDetails.pubName,
    editorName: state => state.newsDetails.editorName,
    createAt: state => state.newsDetails.createAt,
    content: state => state.newsDetails.content,
    myFavourite: state => state.newsDetails.myFavourite,
    related: state => state.newsDetails.related,
   })
  },
  filters:{
   formatTime(time){
    return moment(time).fromNow();
   },
  },
  methods:{
   fetchData(){
    this.$store.dispatch('getDetails',this.id);
   },
   follow(){
    Toast('登录后进行关注');
    this.$router.push("/login");
   },
   contentToggle(){
    this.curHeight=this.$refs.bodyFont.offsetHeight;
    if(parseFloat(this.curHeight)>parseFloat(this.bodyHeight)){
     this.contentStatus=true;
    }else{
     this.contentStatus=false;
    }
//    this.hotCommentScrollTop=this.$refs.hotComment.height;
    console.log(this.hotCommentScrollTop);
   },
  }
 }

子组件related.vue

<template>
  <div v-if="lists.length>0">
    <div class="tagTitle"><span>相关新闻</span></div>
    <div class="listItem" v-if="(item.type=='little')" v-for="(item,index) in lists" :to="{name:'details',params:{id:item.id}}" :key="index" @click="browserDetection()">
     <div class="listImg1">
      <!--<img :src="{lazy==loaded?item.thumb[0]:lazy==loading?'../../assets/images/little_loading.png':lazy==error?'../../assets/images/little_loading.png'}" alt="" v-lazy="item.thumb[0]">-->
      <img :src="item.thumb[0]" alt="" v-lazy="item.thumb[0]">
     </div>
     <div class='titleBox1'>
      <p class="listTitle">{{item.title}}</p>
      <div class="titleInfo">
       <span class="openApp">打开唐人家</span>
       <span v-if="item.top==true" class="toTop">置顶</span>
       <!--<svg class="icon" aria-hidden="true">
        <use xlink:href="#icon-dianzan" rel="external nofollow" ></use>
       </svg>-->
       <span class="like">阅读 {{item.read}}</span>
       <span class="time">{{item.createAt|formatTime}}</span>
      </div>
    </div>
   </div>
  </div>
</template>
<script>
 import {mapActions, mapState, mapGetters} from 'vuex'
 import moment from 'moment'
 export default{
  data(){
   return {
    lists: [],
    id:this.$route.params.id,
   }
  },
  props:{
    related:Array  //重点是这里
  },
  created(){
   moment.locale('zh-cn');
  },
  /*computed: {
   ...mapState({
    related: state => state.newsDetails.related,
   })
  },*/
  filters:{
   formatTime(time){
    return moment(time).fromNow();
   },
  },
  methods:{
  },
  watch: {
   related (val) {
    this.lists = val;
   },
   '$route'(to,from){
    this.id=this.$route.params.id
   }
  }
 }
</script>

效果如图:

父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法

总结

以上所述是小编给大家介绍的父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
让网页根据不同IE版本显示不同的内容
Feb 08 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
理理Vue细节(推荐)
Apr 16 Javascript
js实现图片跟随鼠标移动效果
Oct 16 Javascript
jQuery操作元素的内容和样式完整实例分析
Jan 10 jQuery
vue项目中使用多选框的实例代码
Jul 22 Javascript
在vue中配置不同的代理同时访问不同的后台操作
Sep 11 Javascript
Vue中computed和watch有哪些区别
Dec 19 Vue.js
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 Javascript
JavaScript中时间格式化新思路toLocaleString()
Nov 07 Javascript
vue短信验证性能优化如何写入localstorage中
Apr 25 #Javascript
详解Vue.js中.native修饰符
Apr 24 #Javascript
Vue 动态设置路由参数的案例分析
Apr 24 #Javascript
vue.js前后端数据交互之提交数据操作详解
Apr 24 #Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 #Javascript
vue+webpack实现异步加载三种用法示例详解
Apr 24 #Javascript
vue中$refs的用法及作用详解
Apr 24 #Javascript
You might like
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
Js组件的一些写法
2010/09/10 Javascript
js精度溢出解决方案
2012/12/02 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
python实现点对点聊天程序
2018/07/28 Python
Python的argparse库使用详解
2018/10/09 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
上课迟到检讨书100字
2014/01/11 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
办理收楼委托书范本
2014/10/09 职场文书
个人年终总结怎么写
2015/03/09 职场文书
房租涨价通知
2015/04/23 职场文书
项目验收申请报告
2015/05/15 职场文书
在校证明模板
2015/06/17 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
Tomcat配置访问日志和线程数
2022/05/06 Servers