iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue怎么实现父子组件页面刷新
  • 300
分享到

Vue怎么实现父子组件页面刷新

2023-06-30 08:06:40 300人浏览 薄情痞子
摘要

这篇文章主要介绍“Vue怎么实现父子组件页面刷新”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么实现父子组件页面刷新”文章能帮助大家解决问题。很多时候我们在操作过页面时候,特别是增删改操作之

这篇文章主要介绍“Vue怎么实现父子组件页面刷新”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么实现父子组件页面刷新”文章能帮助大家解决问题。

很多时候我们在操作过页面时候,特别是增删改操作之后,数据会有所改变,这个时候我们希望返回的界面中的数据要和数据库中的数据进行同步,就需要刷新当前页面,如果是使用ajax可以使用异步请求实现页面的局部刷新,Vue常用的几种刷新页面方法如下:

1、原地页面重新加载(不推荐)

this.$router.Go(0) //根据路由重新定向到当前页或者location.reload() //重新加载当前页

上述两种方法可以数据同步,但是其实都是重新加载当前页面,在刷新的时候会出现屏幕闪动,如果当前页面初始化加载的数据或者请求很多的时候,此种方法严重影响效率和体验感。

2、空白页面作为过渡

新建一个空白页面组件empty.vue,点击确定的时候先跳转到这个空白页,然后再立刻跳转回当前页面。

在需要刷新的页面先引入空白页面组件,再添加路由跳转:

//引入空白页面组件import empty from '@/views/organization/empty.vue'//添加路由跳转this.$router.replace({ path:'/empty' });

此种方法基本和上述两种方法,不会出现一瞬间的空白页(如果网络不好或者数据量大也可能会出现),只是地址栏有个快速的切换的过程,如果数据量不大也可以采用。

3、使用Provide / Inject组合控制显示

详情参考官网指导文档。

通常,当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果仍然将 prop 沿着组件链逐级传递下去,可能会很麻烦。

对于这种情况,我们可以使用一对 provideinject。无论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者。这个特性有两个部分:父组件有一个 provide 选项来提供数据,子组件有一个 inject 选项来开始使用这些数据。

此种方法最基本的Vue脚手架工程很容易实现:

在App.vue跟组件中定义变量和方法如下:

<template>  <div id="app">    <router-view v-if="isshow"/>  </div></template><script>export default {  name: 'App',  provide(){   //父组件中通过provide来提供变量,在子组件中通过inject来注入变量。    return{      reload:this.reload    }  },  data(){    return{      isShow:true   //控制视图是否显示的变量    }  },  methods:{    reload(){      this.isShow=false;   //先关闭      this.$nextTick(()=>{        this.isShow=true  //再打开      })    }  }}</script>

在子组件中使用inject注入根组件的reload方法:

<template>  <div>      <div class="header">          <button @click="update()">刷新页面</button>      </div>  </div></template><script>export default {data(){  return{  }},inject:['reload'],//inject注入根组件的reload方法methods:{  update(){    this.reload();    console.log('刷新页面')  }}}</script>

但是我使用的vue项目是基于webpack构建的,整体项目结构有点不同,搞了半天也没搞出来:

<template>  <div id="app">    <router-view v-if="isRouterAlive"/>  </div></template><script lang="ts">    import {        Component,        Vue    } from 'vue-property-decorator'    @Component({        name: 'App',        provide() { //父组件中通过provide来提供变量,在子组件中通过inject来注入变量。            reload: this.reload        },        data() {            return {                isRouterAlive: true //控制视图是否显示的变量            }        },        method: {            reload() {                this.isRouterAlive = false //先关闭                this.$nextTick(() => {                    this.isRouterAlive = true  //再打开                })            }        }    })    export default class extends Vue {}</script>

子组件中注入reload:

<script lang="ts">    import {        updateStore,//更新门店信息        getStoresData,//获取门店列表信息        searchStore//根据门店id和商户id获取门店信息    } from '@/api/organization.ts'        import App from '@/App.vue'        @Component({        components: {            updateStore,            getStoresData,            searchStore        }    })    export default class createTasks extends Vue {    //此处注入relod    inject:['reload'];private async ensureDialog() {            let res = await updateStore(this.fORM)            this.syncDialogVisible = false;            if (res) {                this.$message.success('修改成功');            }            //到达此处说明请求响应成功            this.reload();//此处调用根组件的reload方法        }}

上述做法不生效,如果有大神知道哪个不对,还望不吝赐教。

4、v-on:param父组件监听子组件事件

我们知道Vue有一个特点,只要vue实例中的数据属性值发生改变,页面中使用v-model或者:data渲染绑定的数据也会随之改变,通常情况下展示数据的界面为父组件,需要对父组件中的某一条数据进行增删改查操作时,都会响应弹出一个组件框悬浮在父组件之上单独展示某一条数据的内容,而这个悬浮组件就可以看做是子组件。

所以我们只要在父组件中监听到子组件的行为事件,就可以在进行当前页面的局部数据刷新(非重新加载)。

父组件:index.vue

<template>  <div class="data-container">      <h4>门店管理</h4>    <el-table      :data="list"      fit      highlight-current-row      :header-cell-      ></el-table><addStore :dialogVisible.sync="dialogVisible" v-on:post="getList" @refreshList="getList"></addStore><setCode :dialogVisible.sync="dialogVisible1" @refreshList="getList" :code="codes"></setCode><updateStore :dialogVisible.sync="dialogVisible2" v-on:put="getList" @refreshList="getList" :storeIds="storeId"></updateStore><setUse :dialogVisible.sync="dialogVisible3" @refreshList="getList" @getAppId="getAppIds"></setUse><pagination v-show="total>0" :total="total" :page.sync="pageNo" :limit.sync="pageSize" @pagination="getList" /></div></template><script lang="ts">        import addStore from '@/views/organization/addStore.vue'    import Pagination from "@/components/Pagination/index.vue";    import setCode from '@/views/organization/setCode.vue'    import updateStore from '@/views/organization/updateStore.vue'    import setUse from '@/views/organization/setUse.vue'    @Component({        components: {            addStore,            Pagination,            setCode,            updateStore,            setUse        }    })    export default class extends Vue {        private list: any[] = [];        private pageNo: number = 1;        private pageSize: number = 10;        private total: number = 0;        private dialogVisible: boolean = false;        private dialogVisible1: boolean = false;        private dialogVisible2: boolean = false;        private dialogVisible3: boolean = false;        private appId: string = '';        private codes: string = '';        private storeId: string = '';        private storeForm = {            storeName: '',            storeNumber: ''        }        private form = {            totalAmount: '',            body: ''        }        created() {            this.getList()        }        private async getList() {            let data = await getStoresData(this.pageNo, this.pageSize, this.storeForm)            this.list = data.items; //查询到的门店列表            this.total = this.list.length; //查询到的总记录数        }    }</script>

可以看到上述父组件中包含了以下子组件:

//新增门店子组件<addStore :dialogVisible.sync="dialogVisible" v-on:post="getList" @refreshList="getList"></addStore>//更新门店子组件<updateStore :dialogVisible.sync="dialogVisible2" v-on:put="getList" @refreshList="getList" :storeIds="storeId"></updateStore>

getList方法的作用就是更新当前父组件要展示的数据:

private async getList() {     let data = await getStoresData(this.pageNo, this.pageSize, this.storeForm)     this.list = data.items; //查询到的门店列表}

getStoresData方法:

//分页条件查询商户下门店  export const getStoresData = (pageNo:number,pageSize:number,data:any) =>    request({      url: `/merchant/my/stores/merchants/page?pageNo=${pageNo}&pageSize=${pageSize}&tenantId=${UserModule.tenantId}`,      method: 'post',      data  })

渲染数据:

this.list = data.items; //查询到的门店列表<el-table      :data="list"      fit      highlight-current-row      :header-cell-      >    </el-table>

更新数据子组件updaStore.vue:

<template>  <el-dialog title="修改门店信息" :visible.sync="syncDialogVisible" @open="opend">    <el-form :inline="false">      <el-form-item label="门店名称:" :label-width="formLabelWidth" :rules="[{required:true}]">        <el-input v-model="form.storeName"></el-input>      </el-form-item >      <el-form-item label="门店地址:" :label-width="formLabelWidth">        <el-input v-model="form.storeAddress"></el-input>      </el-form-item>      <el-form-item label="门店编号:" :label-width="formLabelWidth">        <el-input v-model="form.storeNumber"></el-input>      </el-form-item>    </el-form>    <div slot="footer" class="dialog-footer">      <el-button @click="syncDialogVisible = false">取 消</el-button>      <el-button type="primary" @click="ensureDialog">确 定</el-button>    </div>      </el-dialog></template><script lang="ts">    @Component({        components: {            updateStore,            getStoresData,            searchStore        }    })    export default class createTasks extends Vue {        @PropSync('dialogVisible', {            type: Boolean,            default: false        })        syncDialogVisible!: boolean        @PropSync('storeIds', {            type: String        })        storeId!: string        private form = {            id: 0,            storeAddress: '',            storeName: '',            storeNumber: 0,            parentId: 0,            storeStatus: '',            merchantId: 0        }        private storeForm = {            storeNumber: '',            storeName: ''        }        list: any[] = [];        pageNo: number = 1;        pageSize: number = 10;        total: number = 0;        private filterData: any[] = [];        private opend() {            this.getList();        }        private async getList() {            let res = await searchStore(this.storeId);            this.form = res.result;}        private async ensureDialog() {            let res = await updateStore(this.form)            this.syncDialogVisible = false;            if (res) {                this.$message.success('修改成功');            }        }    }</script>

实际应用场景:

Vue怎么实现父子组件页面刷新

Vue怎么实现父子组件页面刷新

在子组件updateStore.vue中,点击确定修改,修改成功之后在当前组件中进行查询门店列表getStoresData:

private async ensureDialog() {            let res = await updateStore(this.form)            this.syncDialogVisible = false;            if (res) {                this.$message.success('修改成功');            }//此处查询列表信息            let ret = await getStoresData(this.pageNo, this.pageSize, this.storeForm);            this.list = ret.items;            this.total = this.list.length;        }

按理论是查询到了修改之后的门店列表list,但是当前是在子组件中,list和父组件index.vue中的list作用域不同,所以父组件中的内容也不会发生改变同步更新,那怎么办呢?

上述我们说了,我们需要父组件监听子组件的事件,当子组件完成相应的操作请求之后可以触发父组件所监听的回调函数,让其父组件index.vue实现list的更新,刷新页面中的数据。

在父组件index.vue中:

//更新门店子组件<updateStore :dialogVisible.sync="dialogVisible2" v-on:put="getList" @refreshList="getList" :storeIds="storeId"></updateStore>

v-on:put="getList"其中的put就是监听子组件的一个可触发事件,所以我们可以在子组件中完成put更新请求之后,触发该事件,让父组件来完成同步更新渲染数据。

此处完成同步更新有两种方式:

  • 子组件直接触发父组件的监听事件,父组件查询列表信息

  • 子组件将查询好的列表信息,在触发监听事件同时传递给父组件

第一种方式:直接触发监听事件

private async ensureDialog() {            let res = await updateStore(this.form)            this.syncDialogVisible = false;            if (res) {                this.$message.success('修改成功');            }            //触发父组件监听事件putthis.$emit('put');        }
//父组件监听到事件putv-on:put="getList"//调用getList方法重新查询列表信息(此处的this.list就是渲染界面的绑定属性),这样完成数据刷新,而不用重新加载整个页面private async getList() {            let data = await getStoresData(this.pageNo, this.pageSize, this.storeForm)            this.list = data.items; //查询到的门店列表            this.total = this.list.length; //查询到的总记录数        }

第二种方式:触发监听事件的同时传递数据

private async ensureDialog() {            let res = await updateStore(this.form)            this.syncDialogVisible = false;            if (res) {                this.$message.success('修改成功');            }//此处查询列表信息            let ret = await getStoresData(this.pageNo, this.pageSize, this.storeForm);            let = ret.items;             = this.list.length;             //触发父组件监听事件put,同时传递数据(后面的皆为参数数据)this.$emit('put',ret.items,ret.items.length);        }
//父组件监听到事件putv-on:put="getList"//根据子组件传递过来的数据进行同步更新渲染(此方法的参数列表个数要与所监听的事件传递的参数个数保持一致)private async getList(param1,param2) {            this.list = param1; //子组件传递过来的列表数据            this.total = param2; //子组件传递过来的列表记录数        }

addStore.vue子组件同样可以用此方法完成同步更新渲染。

关于“Vue怎么实现父子组件页面刷新”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Vue怎么实现父子组件页面刷新

本文链接: https://www.lsjlt.com/news/327848.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue怎么实现父子组件页面刷新
    这篇文章主要介绍“Vue怎么实现父子组件页面刷新”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么实现父子组件页面刷新”文章能帮助大家解决问题。很多时候我们在操作过页面时候,特别是增删改操作之...
    99+
    2023-06-30
  • Vue实现父子组件页面刷新的几种常用方法
    目录1、原地页面重新加载(不推荐)2、空白页面作为过渡3、使用Provide / Inject组合控制显示4、v-on:param父组件监听子组件事件参考文档:很多时候我们在操作过页...
    99+
    2024-04-02
  • Vue子组件关闭后调用刷新父组件怎么实现
    这篇文章主要介绍了Vue子组件关闭后调用刷新父组件怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue子组件关闭后调用刷新父组件怎么实现文章都会有所收获,下面我们一起来看看吧。实现效果调用方法当在子组件...
    99+
    2023-07-05
  • Vue怎么实现刷新页面
    这篇文章主要介绍“Vue怎么实现刷新页面”,在日常操作中,相信很多人在Vue怎么实现刷新页面问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么实现刷新页面”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • ligerui如何实现子页面关闭后父页面刷新以及重新加载
    这篇文章主要介绍了ligerui如何实现子页面关闭后父页面刷新以及重新加载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、需求在子页面处理...
    99+
    2024-04-02
  • vue怎么实现页面刷新动画
    这篇“vue怎么实现页面刷新动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现页面刷新动画”文章吧。index...
    99+
    2023-06-29
  • Vue实现页面的局部刷新(router-view页面刷新)
    利用Vue里面的provide+inject组合 首先需要修改App.vue。 <template> <!-- 公司管理 --> <di...
    99+
    2024-04-02
  • vue父子组件间通信怎么实现
    本篇内容介绍了“vue父子组件间通信怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.父组件传递数据给子组件父组件数据如何传递给子组...
    99+
    2023-07-04
  • vue中怎么实现子组件向父组件传值
    这篇文章给大家介绍vue中怎么实现子组件向父组件传值,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。父组件这么写<component-a v-on:child-say=&...
    99+
    2024-04-02
  • Vue中怎么实现父组件向子组件传值
    这期内容当中小编将会给大家带来有关Vue中怎么实现父组件向子组件传值,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1:在src/components/child/文件夹下...
    99+
    2024-04-02
  • vue实现页面刷新动画
    本文实例为大家分享了vue实现页面刷新动画的具体代码,供大家参考,具体内容如下 做一个vue的页面刷新动画,找了好多动画样式,感谢大佬们造的轮子。 主要就是在index.html文件...
    99+
    2024-04-02
  • Vue中怎么实现非父子组件传值
    Vue中怎么实现非父子组件传值,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前置知识: 1. $emit(event...
    99+
    2024-04-02
  • vue中怎么实现父子组件间通信
    这篇文章将为大家详细讲解有关vue中怎么实现父子组件间通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。组件间通信($parent $refs)父组件要想获...
    99+
    2024-04-02
  • vue中怎么实现父子组件间传值
    今天就跟大家聊聊有关vue中怎么实现父子组件间传值,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。先定义一个子组件,在组件中注册props<te...
    99+
    2024-04-02
  • Vue中怎么实现非父子组件通信
    这篇文章将为大家详细讲解有关Vue中怎么实现非父子组件通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。组件是Vue核心的一块内容,组件之间的通信也是很基本...
    99+
    2024-04-02
  • Vue 中怎么实现非父子组件通信
    这篇文章给大家介绍Vue 中怎么实现非父子组件通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Vue 官网介绍了非父子组件通信方法:不过官网说的太简单了,新手看完估计还是一脸懵逼。还...
    99+
    2024-04-02
  • Vue父组件调用子组件函数实现
    Vue父组件调用子组件的函数 父组件通过事件调用子组件的函数。例如父组件通过 点击事件 让子组件发请求。 文章中的项目已经通过脚手架去创建。 DEMO: Father.js ...
    99+
    2024-04-02
  • Vue父子组件之间事件通信怎么实现
    这篇“Vue父子组件之间事件通信怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue父子组件之间事件通信怎么实现”文...
    99+
    2023-07-05
  • vue中怎么实现子组件传递数据给父组件
    本篇文章为大家展示了vue中怎么实现子组件传递数据给父组件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。发送者:modifyName:是接受者的键,也就是发送和接收...
    99+
    2024-04-02
  • vue中怎么实现父组件向子组件动态传值
    这篇文章将为大家详细讲解有关vue中怎么实现父组件向子组件动态传值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方法有两种,方法一:props传值,这里注意...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作