props传值问题

news/2024/7/19 14:25:36 标签: javascript, 开发语言, ecmascript, 前端, js

父组件和子组件同时展现

同步任务无需添加额外的代码,正常写,而异步任务需要添加下面的解决方案,因为异步任务需要等待响应才能进行赋值。

父组件:

<div>
	<UploadFile ref="child" :data="tableData"></UploadFile>
</div>
javascript">created () {
  this.init();
},
methods: {
  showdialog () {
    this.dialogFormVisible = true;
  },
  init () {
    this.$axios({
      url: `/proxy_version/renew/getList`,
      method: 'post',
      data: {
        pageNo: 1,
        pageSize: 100
      },
      success: (result) => {
        this.tableData = result.data.list[0];
        this.tableData.versionType = "1";
        console.log("this.tableData", this.tableData);
      }
    });
  },
}

通过props父组件在created函数中初始化子组件的数据

子组件:

javascript"> props: ['data'],
 data () {
   return {
     formdata: this.data,
     versionNum: this.data.versionNumber,
   }
 },
 // 或者
created () {
	this.formdata = this.data;
	this.versionNum = this.data.versionNumber;
	console.log("data", this.data);
},

子组件在created中进行接收或者在data中进行更改。
按上面的方法会出现versionNumber等属性undefined,这是因为在父组件调用接口传递数据给子组件时,接口响应显然是异步的。这会导致无论你在父组件哪个钩子发请求,在子组件哪个钩子接收数据,都是取不到的。

解决方法:

1.加上一个v-if进行判断

javascript"><div>
	<UploadFile ref="child" :data="tableData" v-if="tableData"></UploadFile>
</div>

tableData要设置为null或者undefined,或者v-if更改条件,设置为null或defined,则在赋值时不可以this.tableData.versionType = "1";否则报错。在渲染子组件的时候加上一个条件,当有数据的时候在去渲染子组件。这样就会形成天然的阻塞。在父组件的created中的请求返回数据后,才会执行子组件的created,mounted。最后执行父组件的mounted。

2.使用watch进行监听

javascript">watch: {
   data: {
     deep: true,
     handler: function (newVal, oldVal) {
       this.$nextTick(() => {
         this.formdata = newVal
         this.versionNum = newVal.versionNumber;
       })
     }
   }
 },

在子组件中添加watch监听, 父组件获取到值得时候, 就会触发watch监听, 从而实现重新渲染子组件。

父组件点击之后显示子组件

props:

同步任务:

父组件:

<div>
    <el-button @click="showdialog">点击</el-button>
    <div>
      <el-dialog width="50%" title="对象信息" :visible.sync="dialogFormVisible">
        <UploadFile ref="child" :data="tableData"></UploadFile>
      </el-dialog>
    </div>
  </div>
javascript"> showdialog () {
      this.dialogFormVisible = true;
      this.tableData.versionType = "1";
      this.tableData.versionNumber = '1.0.0';
      console.log(this.tableData);
    },

子组件:

javascript"> props: ['data'],
  data () {
    return {
      formdata: this.data,
      versionNum: this.data.versionNumber,
    }
  },
  //或者
created () {
	this.formdata = this.data;
	this.versionNum = this.data.versionNumber;
},

点击事件中为同步代码则没有任何问题,可以显示数据。

异步任务

但如果是异步任务,则无法显示数据,因为异步任务返回结果时,子组件的created和data都已经初始化完成。

解决方案1:

父组件:

<div>
    <el-button @click="showdialog">点击</el-button>
    <div>
      <el-dialog width="50%" title="对象信息" :visible.sync="dialogFormVisible">
        <UploadFile ref="child" :data="tableData"></UploadFile>
      </el-dialog>
    </div>
  </div>
javascript">showdialog () {
	this.dialogFormVisible = true;
	this.$axios({
		url: `/proxy_version/renew/getList`,
		method: 'post',
		data: {
			pageNo: 1,
			pageSize: 100
		},
		success: (result) => {
			this.tableData = result.data.list[0];
			this.tableData.versionType = "1";
			console.log("this.tableData", this.tableData);
	}
});

子组件:

javascript">props: ['data'],
 data () {
   return {
     formdata: {},
     versionNum: null,
   }
 },
 
watch: {
    data: {
      deep: true,
      handler: function (newVal, oldVal) {
        this.$nextTick(() => {
          this.formdata = newVal
          this.versionNum = newVal.versionNumber;
          console.log(this.formdata);
        })
      }
    }
  },

在子组件加入watch函数进行监测。

解决方案2:

父组件:

  <div>
    <el-button @click="showdialog">点击</el-button>
    <div>
      <el-dialog width="50%" title="对象信息" :visible.sync="dialogFormVisible">
        <UploadFile ref="child" :data="tableData" v-if="tableData"></UploadFile>
      </el-dialog>
    </div>
  </div>
 //  父组件点击方法不变,正常写

加上v-if进行判断tableData有没有值,有才渲染子组件

子组件可以在created函数中进行赋值也可以在data中进行赋值。


http://www.niftyadmin.cn/n/5319496.html

相关文章

CSS3简单运用过渡元素(transition)

CSS3过渡 概念&#xff1a;在CSS3中&#xff0c;我们可以使用transition属性将元素的某一个属性从“一个属性值”在指定的时间内平滑地过渡到“另一个属性值”&#xff0c;从而实现动画效果。 CSS3变形&#xff08;transform)呈现的仅仅是一个结果&#xff0c;而CSS过渡&…

一个神奇的SQL聚合查询案例

今天给大家分享一个 SQL 案例&#xff0c;假如存在以下两个表&#xff1a; CREATE TABLE t1 (val1 INT); INSERT INTO t1 VALUES (1), (2), (3);CREATE TABLE t2 (val2 INT); INSERT INTO t2 VALUES (10), (20), (30);每个表包含 3 条数据。请问&#xff0c;以下查询返回结果是…

服务异步通讯——springcloud

服务异步通讯——springcloud 文章目录 服务异步通讯——springcloud初始MQRabbitMQ快速入门单机部署1.1.下载镜像安装MQ SpringAMQPwork Queue 工作队列Fanout Exchange广播模式DirectExchange路由模式TopicExchange话题模式 消息转换器 初始MQ RabbitMQ快速入门 官网https:/…

mongo数据库写入异常唯一key重复

问题提示&#xff1a; DuplicateKeyException: Bulk 完整提示链接&#xff1a; org.springframework.data.mongodb.core.MongoTemplate[2554] find using query: { “uid” : { “$gt” : -1}} fields: Document{{}} for class: class cn.benewtech.reading.domain.origin.kno…

关于java方法定义的回顾

关于java方法定义的回顾 我们在上一篇文章中&#xff0c;对java的面向对象有了一个初步的理解&#xff0c;因为类里面方法是必不可少的&#xff0c;我们本篇文章对方法进行一个回顾&#xff0c;以便加深一下对方法的了解程度和使用&#x1f600;。 我们把前面讲解到方法的文章…

怎么样检查自己系统上的Python环境中是否有某个包(扩展库)?

比如我们这里想看下有没有库pytz 很简单&#xff0c;进入Python的命令行&#xff0c;然后输入下面的命令&#xff1a; import pytz如果有这个库&#xff0c;则不会报错&#xff0c;否则会报错。 Windows的测试结果如下&#xff1a; Centos的测试结果如下&#xff1a;

在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)

无法加载到库问题 问题及分析过程readelf 命令patchelf命令 问题及分析过程 在开发一个程序过程中&#xff0c;需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH&#xff0c;但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了 下面…

代码随想录二刷 |二叉树 | 二叉搜索树中的众数

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉搜索树中的众数 题目描述解题思路递归法非二叉搜索树的方式二叉搜索树的方式 迭代法 题目描述 501.二叉搜索树中的众数 给定一个有相同值的二叉搜索树&#xff08;BST&#xff09;&#xff0c;找出 BST 中的所有众数&…