首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么组件调用了两次

为什么组件调用了两次
EN

Stack Overflow用户
提问于 2020-08-12 11:25:25
回答 3查看 6K关注 0票数 10

我在componentDidMount中有React组件,从服务器获取数据。问题是componentDidMount调用了两次,API也调用了两次。我有一个视图增量API,就像youtube视频视图在数据库中增加两次,因为有两次API调用。

代码语言:javascript
运行
AI代码解释
复制
class SingleVideoPlay extends React.Component {
    constructor(props) {
        super(props);
        this.player = React.createRef();
    }
    state = {
        autoPlay: true,
        relatedVideos: [],
        video: null,
        user: null,
        comments: [],
        commentInput: {
            value: '',
            touch: false,
            error: false
        },
        following: false,
        tab: 'comments'
    };
    _Mounted = false;

    componentDidMount() {
        this._Mounted = true;
        if (this._Mounted) {
            const videoId = this.props.match.params.id;
            this.getVideoDetails(videoId);
        }
    }
    componentWillUnmount() {
        this._Mounted = false;
        try {
            clearInterval(this.state.videoInterval);
            this.props.videoEditUrl('');
        } catch (error) {}
    }
    captureVideoTime = async () => {
        const { video } = this.state;
        const result = await updateWatchTime({
            id: video._id,
            time: 1
        });
        if (result.status === 200) {
            const updateVideo = {
                ...video,
                secondsWatched: video.secondsWatched + 1
            };
            this.setState({ video: updateVideo });
        }
    };
    videoEnded = () => {
        clearInterval(this.state.videoInterval);
    };
    videoPause = () => {
        clearInterval(this.state.videoInterval);
    };
    loadVideo = () => {
        clearInterval(this.state.videoInterval);
    };
    playingVideo = () => {
        const interval = setInterval(this.captureVideoTime, 1000);
        this.setState({ videoInterval: interval });
    };
    
    getVideoDetails = async (videoId) => {
        const video = await getVideo(videoId);

        if (video.status === 200) {
            let response = video.data;
            if (this.props.userId)
                if (response.user._id === this.props.userId._id)
                    this.props.videoEditUrl(`/video/edit/${response.media._id}`);
            this.setState({
                relatedVideos: response.videos.docs,
                video: response.media,
                user: response.user
            });
            this.checkIsFollowing();
            this.updateVideoStat(response.media._id);
        }
    };
    updateVideoStat = async (id) => videoView(id);
    checkIsFollowing = async () => {
        const { userId } = this.props;
        const { video } = this.state;
        if (userId && video) {
            const response = await isFollow({
                follower: userId._id,
                following: video._id
            });
            if (response) {
                this.setState({ following: response.following });
            }
        }
    };
    addOrRemoveFollowing = async () => {
        this.checkIsFollowing();
        const { following, video } = this.state;
        const { userId } = this.props;
        if (userId) {
            if (following) {
                const response = await removeFollow({
                    follower: userId._id,
                    following: video._id
                });
                this.setState({ following: false });
            } else {
                const response = await addFollow({
                    follower: userId._id,
                    following: video._id
                });
                this.setState({ following: true });
            }
        }
    };

    submitCommentHandler = async (event) => {
        const { userId } = this.props;
        event.preventDefault();
        if (userId) {
            const result = await saveComment({
                mediaId: this.state.video._id,
                parentId: '0',
                userID: userId._id,
                userName: userId.username,
                comment: this.state.commentInput.value
            });
            console.log(result);
            if (result.status === 200) {
                this.getVideoComments();
                this.setState({ commentInput: { value: '', touch: false, error: false } });
            }
        }
    };

    render() {
        const { autoPlay, relatedVideos, video, user, comments, commentInput, following, tab } = this.state;
        const { userId } = this.props;
        return (
            <div className="container-fluid">
        
            some coponents
            </div>
        );
    }
}

const mapStateToProps = (state) => ({
    userId: state.auth.user
});

export default connect(mapStateToProps, { videoEditUrl })(SingleVideoPlay);

我不知道为什么componentDidMount打了两次电话,它显示了记忆的说教问题。

如何修正它.

EN

回答 3

Stack Overflow用户

发布于 2022-04-30 13:54:14

在组件周围使用<React.StrictMode>可能会导致多个<React.StrictMode>调用。移除它之后,两个电话就消失了。

这是用于帮助检测意外副作用的行为。您可以阅读更多关于它的在医生里。它只发生在开发环境中,而在生产中,componentDidMount只被调用一次,甚至在<React.StrictMode>中也是如此。

这是用React 18.1.0测试的。

票数 30
EN

Stack Overflow用户

发布于 2020-08-12 11:30:13

我认为这个问题存在于使用SingleVideoPlay组件的父组件上。该父组件可能导致SingleVideoPlay组件多次呈现。此外,您的代码也有一个问题。

代码语言:javascript
运行
AI代码解释
复制
    componentDidMount() {
        this._Mounted = true;
        if (this._Mounted) {
            const videoId = this.props.match.params.id;
            this.getVideoDetails(videoId);
        }
    }

在这里,不需要检查是否是this._Mounted,因为它将永远是真的。

票数 -1
EN

Stack Overflow用户

发布于 2022-04-25 02:32:50

1.通过npm i jQuery安装jquery

  1. 从'jquery‘导入$
  2. 在导出命令之后或在文件末尾创建函数或jwuery代码
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63383473

复制
相关文章
数据挖掘知识脉络与资源整理(九)–柱形图
柱形图 简介 英文:histogram或者column diagram 排列在工作表的列或行中的数据可以绘制到柱形图中。在柱形图中,通常沿水平轴组织类别,而沿垂直轴组织数值。 柱形图具有下列图表子类型
小莹莹
2018/04/25
3.8K0
数据挖掘知识脉络与资源整理(九)–柱形图
R数据可视化之ggplot2 (一)
学完R语言的基本操作后,我们还可以继续学习R的几大著名而且使用强大的包,今天讲其中的一个,就是ggplot2,至于这个包的评价和地位,我就不多说了,感兴趣可以百度,它绝对是数据可视化的利器,好了,我们先来开始简单介绍一下这个包. 先说说我们人手工作图的方式,1,先画一个坐标轴,2,然后根据数据在图上画图形3,在基础的图形上加一些注释,或加一些对比.基本上这就是我们作图的方式,那么ggplot2就跟这差不多了,1.先设定坐标轴和数据2,选择要画图形的类型3,添加一些图形,4,丰富一下图形的信息.ggpl
小莹莹
2018/04/23
2K0
R数据可视化之ggplot2 (一)
R基础知识及快速检阅你的数据
考虑到公众号后台数不胜数的提问其实并不是生物学知识或者数据处理知识的困惑,仅仅是绘图小技巧以及数据转换的困难。所以我们一再强调系统性掌握编程知识的重要性,在这个打基础方面我让实习生“身先士卒”,起码每个人在每个编程语言上面都需要看至少五本书而且每本书都需要看五遍以上,并且详细的记录笔记。
生信技能树
2022/06/08
4K0
R基础知识及快速检阅你的数据
「R」数据可视化4 : 直方图/条形图
本文作者蒋刘一琦,自嘲是一个有艺术追求的生信狗,毕业于浙江大学生物信息学专业,目前在复旦大学就读研究生,研究方向为宏基因组。
王诗翔呀
2020/07/06
2.9K0
「R」数据可视化4 : 直方图/条形图
文献配套GitHub发表级别绘图之饼图
ggplot2是R语言最流行的第三方扩展包,是RStudio首席科学家Hadley Wickham读博期间的作品。根据其绘图理念,图形由以下几个模块组成:
生信技能树
2022/03/03
2K0
文献配套GitHub发表级别绘图之饼图
了解绘制条形图和折线图的细节
考虑到公众号后台数不胜数的提问其实并不是生物学知识或者数据处理知识的困惑,仅仅是绘图小技巧以及数据转换的困难。所以我们一再强调系统性掌握编程知识的重要性,在这个打基础方面我让实习生“身先士卒”,起码每个人在每个编程语言上面都需要看至少五本书而且每本书都需要看五遍以上,并且详细的记录笔记。
生信技能树
2022/06/08
7.2K0
了解绘制条形图和折线图的细节
在背景图上面加滤镜层之后添加内容
实现步骤: 第一步,需要一个大容器让图片作为该容器的背景图片。 第二步,再在这个大容器中添加一个二级容器作为滤镜层(指定宽度,高度 ,背景色) 第三步,最后在二级容器中添加需要的的内容 <div class="first_big_bg">//大容器 添加背景 <div class="second_lving">//二级容器 添加滤镜 <div class="myself_content_partial">//自己的内容
wfaceboss
2019/04/08
7980
使括号有效的最少添加
给定一个由(和)括号组成的字符串S,我们需要添加最少的括号(或是),可以在任何位置,以使得到的括号字符串有效。 从形式上讲,只有满足下面几点之一,括号字符串才是有效的:
WindRunnerMax
2020/09/01
4230
R语言绘图之ggplot2包「建议收藏」
6月份一直在忙期末考试,今天来迅速的学习下ggplot2包的简单绘图。 R的基础包里面也有很多画图函数,例如plot();barplot();qqplot(); 但是还有大名鼎鼎的ggplot2包,用这个包的函数画出的图比较漂亮,而且使用灵活。
全栈程序员站长
2022/07/23
2.1K0
R语言绘图之ggplot2包「建议收藏」
Origin绘图之条形图上加曲线拟合图
有时,写论文时,我们要做一些描述性统计,经常用到条形图来表示我们的数据,同时在条形图上可以加入曲线拟合的情况。如下图所示:
全栈程序员站长
2022/08/29
1.4K0
Origin绘图之条形图上加曲线拟合图
双坐标分别绘制条形图和折线图
生信技能树jimmy
2023/09/26
3140
双坐标分别绘制条形图和折线图
腾讯地图JSAPI-在地图上添加自定义覆盖物
在地图上添加覆盖物有两种方式,一是在canvas画布上渲染,比如JSAPI GL绘制MultiMarker/MultiPolygon等矢量图形覆盖物就是通过编写对应图形的数据解析及渲染程序,直接绘制在底图上层。这样的渲染方式下视角变换时图形也可以实现3D形变。另一种方式是通过CSS布局将其他DOM元素叠加到地图容器之上,这种方式下视角变换时DOM元素需重新计算布局,比如JSAPI v2的Marker/Polygon等覆盖物,以及JSAPI GL的InfoWindow信息窗,这些都属于DOM覆盖物。
腾讯位置服务
2020/06/19
3.5K0
(数据科学学习手札37)ggplot2基本绘图语法介绍
  ggplot2是R语言中四大著名绘图框架之一,且因为其极高的参数设置自由度和图像的美学感,即使其绘图速度不是很快,但丝毫不影响其成为R中最受欢迎的绘图框架;ggplot2的作者是现任Rstudio首席科学家的Hadley Wickham,ggplot2基于Leland Wilkinson在Grammar of Graphics(图形的语法)中提出的理论,取首字母缩写再加上plot,于是得名ggplot,末尾的2是因为Hadley写包的一个习惯——对先前的版本不满意便写一个新版本的名称不变仅在末尾加上2,如reshape2等;
Feffery
2018/05/26
7K0
玩转数据地图系列之——地图上的迷你条形图
最近忙的厉害,产量下降的有点严重,感谢各位还没取关的小伙伴儿。 一周前更新了一篇数据地图上的气泡散点图的内容,不知怎地,这段时间就是跟地图死磕上了,今天还是数据地图,不过是在数据地图上呈现条形图、柱形图。 之前的一篇因为有现成的作图包支持,geom_scatterpie函数不用花费太大力气就解决了数据地图上的气泡散点图问题。 可是到目前为止我还没有发现支持对应坐标位置的条形图、柱形图,这一篇是参考了知乎上大神提供的思路。 加载包: library(maptools) library(ggplot2) lib
数据小磨坊
2018/04/11
2.6K1
玩转数据地图系列之——地图上的迷你条形图
今天,你学绘图了吗?
我们都知道条形图通过直的或水平的条形开展型量的分布( 数)。函数barplot()的最简单的用法是: barplot(height),其中的height是一个向量或一个
黑妹的小屋
2020/08/06
1.1K0
这些条形图的用法您都知道吗?
条形图专用于离散变量和数值变量之间的可视化展现,其通过柱子的高低,直观地比较离散变量各水平之间的差异,它被广泛地应用于工业界和学术界。在R语言的ggplot2包中,读者可以借助于geom_bar函数轻松地绘制条形图。对于条形图大家对其的印象是什么呢?又见过哪些种类的条形图呢?在本篇文章我将带着各位网友说道说道有关条形图的哪些品种。
1480
2019/08/05
5.6K0
这些条形图的用法您都知道吗?
ggplot2在图上添加线性拟合方程和R值
今天给大家分享三种在ggplot2包画的图形上添加拟合的线性回归方程和R^2的值的方法。
生信交流平台
2020/09/14
14.8K0
文献配套GitHub发表级别绘图03-条形图
文章来源:"Preoperative immune landscape predisposes adverse outcomes in hepatocellular carcinoma patients with liver transplantation" (2021,npj Precision Oncology),数据与代码全部公开在https://github.com/sangho1130/KOR_HCC。
生信技能树
2022/03/03
1.5K0
文献配套GitHub发表级别绘图03-条形图
LeetCode - 使括号有效的最少添加
原题地址:https://leetcode-cn.com/problems/minimum-add-to-make-parentheses-valid/
晓痴
2019/07/24
4850
LeetCode - 使括号有效的最少添加
课后笔记:ggplot2优雅的显示WB结果
但是学生的表现实在是太超出我意料了,能超脱于现有的工具,达到随心所欲的定制化,值得分享!
生信技能树
2021/07/06
2.6K0

相似问题

Eclipse中的多目标模式错误

33

Eclipse显示错误(无法解析目标)

31

错误显示“无法连接到目标”

15

无法将Sony Xperia L C2104连接到eclipse

80

将SQL Server 2005连接到Eclipse

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文