父组件中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 相关文章推荐
javascript 计算两个整数的百分比值
Dec 26 Javascript
jQuery 选择器项目实例分析及实现代码
Dec 28 Javascript
JavaScript用Number方法实现string转int
May 13 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
Jun 01 Javascript
微信小程序链接传参并跳转新页面
Nov 29 Javascript
JS重载实现方法分析
Dec 16 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
基于JavaScript实现的折半查找算法示例
Apr 14 Javascript
JavaScript常见JSON操作实例分析
Aug 08 Javascript
JS实现求5的阶乘示例
Jan 21 Javascript
一文了解Vue中的nextTick
May 06 Javascript
vue内置组件component--通过is属性动态渲染组件操作
Jul 28 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 header()函数语法及使用代码
2013/11/04 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
JavaScript基础——使用Canvas绘图
2016/11/02 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
简单的Python抓taobao图片爬虫
2014/10/26 Python
Python之py2exe打包工具详解
2017/06/14 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
python的re正则表达式实例代码
2018/01/24 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
详解Scrapy Redis入门实战
2020/11/18 Python
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
人事科岗位职责范本
2014/03/02 职场文书
关于保护环境的标语
2014/06/09 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
首次购房证明
2015/06/19 职场文书