React 同一组件的多个实例获得相同的状态

2024-01-07

我有一个 React 组件,我正在创建它的 2 个副本。然而,当其中 1 个状态更新时,第 2 个状态也会更新。我不确定是什么原因造成的。

这是我的代码:

这是我使用两个组件的地方:

{this.state.selectedTab === 0 ?
    <Carousel
       size={1}
       cultureInfo={this.state.cultureInfo}
       collaboratorError={this.state.activeCollaborationError}
       getPinnedError={this.state.getPinnedUsersError}
       pinActionError={this.state.isPinnedServerError}
       user={this.state.activeCollaboratorContactsData}
       isPinnedTab={false}
       startDate={this.state.startDate}
       isMapped={this.state.isMapped}
       resetPosition={this.state.resetCollabCarousel}
       isVisible={this.state.selectedTab === 0 }
/>
:
<Carousel
  size={1}
  cultureInfo={this.state.cultureInfo}
  collaboratorError={this.state.activeCollaborationError}
  getPinnedError={this.state.getPinnedUsersError}
  pinActionError={this.state.isPinnedServerError}
  user={this.state.pinnedUsers}
  isPinnedTab={true}
  startDate={this.state.startDate}
  isMapped={this.state.isMapped}
  resetPosition={this.state.resetPinnedCarousel}
  isVisible={this.state.selectedTab === 1}
/>
}

这是轮播代码:

interface ICarouselProps {
 size: number;
 cultureInfo: CultureInfo;
 collaboratorError: Error.DataLayerError;
 getPinnedError: Error.DataLayerError;
 pinActionError: Error.DataLayerError;
 user: ActiveCollaboratorContact[];
 isPinnedTab: boolean;
 startDate: Date;
 isMapped: boolean;
 resetPosition: boolean;
 isVisible: boolean;
}

interface ICarouselState {
 position: number;
 width: number;
 isActiveNext: boolean;
 isActivePrev: boolean;
 isActive: number;
 }

 const numSlides = 2;
 const width = 100;
 const move = width / numSlides;
 const max = width - move;
 const min = -max;

 const numOfCards = 4;

 export default class Carousel extends BaseComponent<ICarouselProps,     

      ICarouselState> {
constructor() {
    super();
    this.resetState();
}

componentWillReceiveProps(newProps: ICarouselProps): void {
    if (newProps && newProps.resetPosition) {
        this.resetState();
    }
}

doRender(): React.ReactElement<{}> {
    let wrapperWidth: number;
    let widthStyle: string;
    wrapperWidth = (this.state as ICarouselState).width;

    const style:  React.CSSProperties = {
        WebkitTransform: "translateX(" + this.state.position + "%)",
        transform: "translateX(" + this.state.position + "%)",
        MozTransform: "translateX(" + this.state.position + "%)",
        msTransform: "translateX(" + this.state.position + "%)",
        OTransform: "translateX(" + this.state.position + "%)",
        width: wrapperWidth + "%"
    } as React.CSSProperties;
    const slideWidth:  React.CSSProperties = {width: move + "%"} as React.CSSProperties;
    let nextIsDisabled: boolean;
    let prevIsDisabled: boolean;
    let slideActive: string;

    widthStyle = (this.props.size === 0) ? styles.vCard : styles.hCard;
    nextIsDisabled = !this.state.isActiveNext;
    prevIsDisabled = !this.state.isActivePrev;
    slideActive = "slideActive" + this.state.isActive;

        const totalUsers = this.props.user.length;
        const articles: JSX.Element[] = [];


        for (let i = 0; i < 2; i++) {
            const cards: JSX.Element[] = [];
            for (let j = 0; j < numOfCards; j++) {
                const userIndex = i * numOfCards + j;
                if (userIndex < totalUsers) {
                    const card: JSX.Element = <Card
                        cultureInfo={this.props.cultureInfo}
                        user={this.props.user[userIndex]}
                        startDate={this.props.startDate}
                        extraMargin={userIndex % numOfCards === 0}
                    />;
                    cards.push(card);
                }
            }
            const article: JSX.Element =
                    <article className={styles.slideSingle}
                            tabIndex={0}
                            style={slideWidth}>
                        {cards}
                    </article>;
            articles.push(article);
        }
        return this.props.isVisible ?
                <div>
                    <div className={widthStyle + " " + styles.carousel + " " + slideActive} tabIndex={-1} id="Carousel">
                        <div className={styles.slideWrapper}
                            style={style}>
                            {articles}
                        </div>
                        <nav className={styles.nav}>
                            <ul className={styles.arrows}>
                                <li className={styles.stepLeft}>
                                <a disabled={prevIsDisabled} aria-disabled={prevIsDisabled} className={styles.previous} href="#"
                                    tabIndex={0}
                                    onClick = {this.prevSlideClicked}>
                                    BUTTONPREVTEXT
                                </a>
                                </li>
                                <li className={styles.stepRight}>
                                <a disabled={nextIsDisabled} aria-disabled={nextIsDisabled} className={styles.next} href="#"
                                    tabIndex={0}
                                    onClick = {this.nextSlideClicked}>BUTTONNEXTTEXT
                                </a>
                                </li>
                            </ul>
                        </nav>
                    </div>
               </div> :
               null;

};

private resetState(): void {
    const newState: ICarouselState = {
            position: 0,
            width: numSlides * 100,
            isActiveNext: true,
            isActivePrev: false,
            isActive: 0
        };

    if (this.state) {
        this.setState(newState);
    } else {
        this.state = newState;
    }
}

private nextSlideClicked: () => void = () => {
    if (this.state.position > min + move) {
        this.setState({
            position: this.state.position - move,
            width: numSlides * 100,
            isActiveNext: true,
            isActivePrev: true,
            isActive: Math.abs((this.state.position - move) / move)
        });
    } else if ((this.state as ICarouselState).position > min) {
        this.setState({
            position: this.state.position - move,
            width: numSlides * 100,
            isActiveNext: false,
            isActivePrev: true,
            isActive: Math.abs((this.state.position - move) / move)
        });
    }
};

private prevSlideClicked: () => void = () => {
    if (this.state.position < 0 - move) {
        this.setState({
            position: this.state.position + move,
            width: numSlides * 100,
            isActiveNext: true,
            isActivePrev: true,
            isActive: Math.abs((this.state.position + move) / move)
        });
    } else if (this.state.position < 0) {
        this.setState({
            position: this.state.position + move,
            width: numSlides * 100,
            isActiveNext: true,
            isActivePrev: false,
            isActive: Math.abs((this.state.position + move) / move)
        });
    }
};

private getCarouselName(): CarouselNames {
    return "name"
}

};

Thanks.


我有同样的问题。我在每个实例上设置了不同的“关键”属性,问题就消失了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 同一组件的多个实例获得相同的状态 的相关文章

随机推荐

  • 如何在 Symfony 2 / Doctrine 中启用 ENUM

    跑步时doctrine mapping import我收到错误 请求未知的数据库类型枚举 Doctrine DBAL Platforms MySqlPlatform 可能不支持它 看来我需要设置use native enum to true
  • TamperMonkey 中的 GM_addStyle 等效项

    是否有与 GreaseMonkey 相当的 TamperMonkeyGM addStyle添加CSS的方法 在 GreaseMonkey 中 您可以向多个元素添加一堆 CSS 属性 如下所示 GM addStyle body color w
  • Node.js 中确定一个路径是否是另一个路径的子目录

    我正在研究一个MQTT 处理程序 https github com jsdario replyer我想为每个有事件侦听器的父目录发出一个事件 例如 如果有以下可用的 MQTT 路径 其中有下标 这些路径有事件监听器 test replyer
  • 与大括号初始化末尾的额外“,”有任何关联吗?

    除了明显的名称之外 以下两个声明之间是否有区别 int main char str1 17 H e l l o char str2 17 H e l l o 第二个中多余的 是怎么回事 这有什么意义吗 两者似乎都编译得很好 在这种情况下 它
  • 我可以在 Django 中使用数据库视图作为模型吗?

    我想使用在数据库中创建的视图作为 django view 的源 不使用自定义sql 这可能吗 13 02 09 更新 就像许多答案所建议的那样 您可以在数据库中创建自己的视图 然后通过在 models py 中定义它来在 API 中使用它
  • 单字节异或密码 (python)

    这是我目前正在学习的现代密码学课程 挑战是 cryptopals 挑战 3 单字节 XOR 密码 我正在尝试使用 python 3 来帮助完成此任务 我知道我应该对字符串进行异或并转换为英语 十六进制字符串为 1b37373331363f7
  • ImageMagick - 与其他照片管理应用程序一样自动调整图像的颜色?

    一些照片管理应用程序 例如 flickr 网站上的 Picnic gnome 桌面上的 F Spot 可以选择 自动更正 自动修复 图像 这似乎可以调整图像中的颜色以使其看起来更美观好一些 例如 这是之前的 and after 无论如何 是
  • 联合中的字符串、段错误

    这基本上是一个标记联合 include
  • 我需要在 vba 中解释 activecell.offset

    我在理解一些 VBA 代码时遇到一些困难 我没有问题 activecell offset 1 1 select 但是 我有问题 activecell offset 1 1 range A1 select AND ActiveCell Off
  • TranslateAccelerator 和禁用的菜单项

    在我的应用程序中 我根据上下文启用 禁用菜单项 如果文本区域具有焦点 我会禁用与导航键冲突的加速器 例如 Ctrl 左 右 根据微软的文档 http msdn microsoft com en us library windows desk
  • 锚标记转到网页的错误部分

    这是问题所在的实际视频记录 我不想以任何方式做广告 https www youtube com watch v 7b38cQ0VGWI https www youtube com watch v 7b38cQ0VGWI 所以我创建一个网站只
  • 如何提高C++中merkle根计算的速度?

    我正在尝试尽可能优化默克尔根计算 到目前为止 我用 Python 实现了它 结果是这个问题 https stackoverflow com questions 67355203 how to improve the speed of mer
  • 如何防止按钮提交表单

    在下一页中 使用 Firefox 删除按钮会提交表单 但添加按钮不会提交表单 我该如何预防remove提交表单的按钮 function addItem var v form hidden last attr name var n input
  • 托管WPF插件跨进程问题

    我使用类似的方法http www codeproject com Articles 516431 Baktun Shell Hosting WPF Child Windows in Another http www codeproject
  • 检测到 HTML 文本框的拖放?

    我的网页上有一个正常的搜索框 它充满了文字 Search this website 当您单击框中输入搜索查询时 此文本将被删除 onfocus if this value Search this website this value 但是
  • 如何在Mac终端中使用SoX从文本文件中修剪特定时间的音频文件?

    我有一个文本文件 如下所示文本文件 https i stack imgur com iDm8k png 我想使用 sox 根据文本文件中的时间修剪音频文件 这样我就可以有从 0 0 到 6 16 6 16 到 13 44 13 44 到 1
  • 使用 selenium Java 或 cypress 中的 e2e 进行 Angular/SPA 应用程序的代码覆盖率

    我们想要测量 Angular 8 应用程序代码覆盖率 我们有一个用 selenium java 编写的 e2e 测试用例 它加载部署在浏览器中另一台机器上的 Angular 应用程序 并运行一些 e2e 测试用例集 问题是我如何测量 Ang
  • 字节序理论和概念

    这不是任何编程语言特有的问题 假设您在大端机器上编写了一些文件 并且您知道这一点 如果两个单字节值被连续写入 你怎么知道 Big endian 颠倒了 16 32 和 64 位值的顺序 那么您如何知道需要将其作为单个字节读取呢 例如 您写入
  • pygame中显示网格时角色移动缓慢

    我正在 pygame 中制作贪吃蛇游戏 我注意到了一件奇怪的事情 每当我显示网格时 我的角色都会缓慢运行 这是我的程序的主要功能 我刚刚开始学习pygame def main global SCREEN CLOCK pygame init
  • React 同一组件的多个实例获得相同的状态

    我有一个 React 组件 我正在创建它的 2 个副本 然而 当其中 1 个状态更新时 第 2 个状态也会更新 我不确定是什么原因造成的 这是我的代码 这是我使用两个组件的地方 this state selectedTab 0