当前位置: 首页 > news >正文

服饰视频网站建设百度网盘客服电话24小时

服饰视频网站建设,百度网盘客服电话24小时,免费室内装修设计软件,买实体服务器做网站一、问题描述封装了一个Chart组件,它接收一个boolean类型的props,根据这个boolean的true或false执行不同的操作。经过console.log验证,onReady函数只会在组件初次渲染时取到props值,不管后面的props变化成什么都无法重新取值。二、…

一、问题描述

封装了一个Chart组件,它接收一个boolean类型的props,根据这个boolean的true或false执行不同的操作。经过console.log验证,onReady函数只会在组件初次渲染时取到props值,不管后面的props变化成什么都无法重新取值。

二、代码描述

初始化状态为0,useRequest拿到后端的值为1。

传递给Chart组件的props,是可以拿到最新的,可以在40行的打印中看到。

但是onReady挂载的坐标轴点击事件打印出的却不会变化,依然是0。

// 父组件
import React, { useState, useEffect } from 'react';
import { useRequest } from 'ahooks';const FatherComponent = () => {const [flag, setFlag] = useState(0);const { data, loding, run } = useRequest(async (params) => {try {const { data, success, msg } = awiat getData();if (!success) {return [];}setFlag(data.flag)return data;} catch(e) { console.log(e) };return [];}, { manual: true })useEffect(() => {if (!isUndefined(data)) {setFlag(data.flag)}}, [data])return (<div>{data && <ChildChartComponent data={data} flag={flag} />}</div>)
}
export default FatherComponent;// 子组件
import React from 'react'
import { Column } from "@ant-design/plots";const ChildChartComponent = (props) => {const { data, flag } = props;console.log(flag)const config = {data,// ...many config settings, it's unimportantonReady: (plot) => {plot.on("axis-label:click", (e) => {if (Number(flag) === 1) {console.log('执行props.flag为true的逻辑');} else {console.log('执行props.flag为false的逻辑');}})}}return (<Column {...config} />)
}
export default ChildChartComponent;

三、原因解析

这个问题研究了整整一天,换了很多种方式都寻找不到问题所在。

一开始想是我得状态不对,再之后是觉得是最新的onReady没有被重新赋值给chart组件。

在官方文档中没找到相关问题描述,于是乎,我打开Github进入到组件仓库,在issues里找Bug和提问,终于被我找到跟我有相关问题的同志。

原来是因为onReady()函数是一个闭包,在子组件初次渲染的时候,它保存的值是初始值0,所以一直拿不到新状态。

四、修改子组件的写法,利用useRef解决闭包问题

我们声明一个ref,在effect中的deps校验规则设置为flag,effect方法内将ref的current每一次都指向flag。

将onReady中的on方法内的通过flag判断改为通过flagRef.current判断即可。

useRef可以解决闭包问题的原因在于: useRef 返回的是 { current: null },将对应数据赋值给 current,在声明之后,引用地址是不变的。

// 子组件
import React, { useRef, useEffect } from 'react'
import { Column } from "@ant-design/plots";const ChildChartComponent = (props) => {const { data, flag } = props;const flagRef = useRef(null)useEffect(() => {flagRef.current = flag;}, [flag])const config = {data,// ...many config settings, it's unimportantonReady: (plot) => {plot.on("axis-label:click", (e) => {if (Number(flagRef.current) === 1) {console.log('执行props.flag为true的逻辑');} else {console.log('执行props.flag为false的逻辑');}})}}return (<Column {...config} />)
}
export default ChildChartComponent;

http://www.tj-hxxt.cn/news/41368.html

相关文章:

  • 专业简历制作网站推荐品牌宣传方式
  • wordpress 后台子菜单百度推广优化排名怎么收费
  • 日本向中国收二维码费用关键词优化报价推荐
  • 做网站好赚钱网上怎么免费推广
  • 检察院门户网站建设自查报告百度搜索引擎服务项目
  • windows做的ppt下载网站网址推荐
  • 购买域名后 可以做网站么网上seo研究
  • 银川网站建设哪家好网络营销推广公司名称
  • wordpress 做网站福州seo
  • 网站开发企业培训心得总结seo自学教程推荐
  • 深圳公司做网站凡科网小程序
  • 做文字的网站百度网站提交了多久收录
  • 杭州网站关键词2021百度最新收录方法
  • 武汉培训网站建设线上营销推广
  • 手表网站 云网站收录查询工具
  • 电子商务网站的类型搜索优化是什么意思
  • 网站已备案添加新域名市场调研分析报告
  • 济南网站建设外包公司哪家好网络营销成功的原因
  • 农业网站开发简单的网页设计
  • 麦当劳订餐网站 是谁做的网站页面seo
  • 怎么利用网站做cpa推广苏州关键词优化排名推广
  • 沈阳网站建设哪家便宜班级优化大师下载安装
  • 靠谱网站建设公司报价哈尔滨seo推广
  • 做网站有没有前途重庆百度seo整站优化
  • 展览设计网站有哪些郑州seo排名哪有
  • 拉了专线可以直接做网站吗网页制作源代码
  • 怎么做网站内部搜索功能怎样搭建自己的网站
  • 制作个人网站怎么做网络销售是什么工作内容
  • 企业网站明细费用百度爱采购推广怎么入驻
  • 无锡市网站设计深圳网络推广招聘