Reactjs React同一组件的多个实例获得相同的状态
我有一个React组件,我正在创建它的两个副本。但是,当其中一个的状态更新时,它也会更新第二个。我不确定这是什么原因造成的 这是我的密码: 这是我使用2个组件的地方:Reactjs React同一组件的多个实例获得相同的状态,reactjs,state,Reactjs,State,我有一个React组件,我正在创建它的两个副本。但是,当其中一个的状态更新时,它也会更新第二个。我不确定这是什么原因造成的 这是我的密码: 这是我使用2个组件的地方: {this.state.selectedTab === 0 ? <Carousel size={1} cultureInfo={this.state.cultureInfo} collaboratorError={this.state.activeCollaborationE
{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}
/>
}
{this.state.selectedTab==0?
:
}
这是传送带代码:
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"
}
接口ICarouselProps{
大小:数量;
cultureInfo:cultureInfo;
collaboratorError:Error.DataLayerError;
GetPinneError:Error.DataLayerError;
pinActionError:Error.DataLayerError;
用户:ActiveCollaboratorContact[];
isPinnedTab:布尔型;
起始日期:日期;
isMapped:布尔型;
重置位置:布尔值;
isVisible:布尔;
}
接口ICarouselState{
职位:编号;
宽度:数字;
isActiveNext:布尔型;
isActivePrev:布尔型;
isActive:数字;
}
常数numSlides=2;
常数宽度=100;
常量移动=宽度/numSlides;
const max=宽度-移动;
常数最小值=-最大值;
常数numocards=4;
导出默认类Carousel扩展BaseComponent{
构造函数(){
超级();
这个.resetState();
}
组件将接收道具(新道具:ICarouselProps):无效{
if(newProps&&newProps.resetPosition){
这个.resetState();
}
}
doRender():React.ReactElement{
让包装宽度:数字;
字体:字符串;
wrapperWidth=(this.state为ICarouselState).width;
常量样式:React.cssprroperties={
WebKittTransform:“translateX(“+this.state.position+”%)”,
转换:“translateX(“+this.state.position+”)”,
MozTransform:“translateX(“+this.state.position+”%)”,
msTransform:“translateX(“+this.state.position+”)”,
OTransform:“translateX(“+this.state.position+”)”,
宽度:包装宽度+“%”
}as React.csp属性;
const slideWidth:React.CSSProperties={width:move+“%”作为React.CSSProperties;
设为禁用:布尔值;
设前置禁用:布尔型;
让slideActive:字符串;
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;
常量项目:JSX.Element[]=[];
for(设i=0;i<2;i++){
常量卡:JSX.Element[]=[];
for(设j=0;j
:
无效的
};
private resetState():void{
常量新闻状态:ICarouselState={
位置:0,
宽度:numSlides*100,
是的,
伊萨维普雷夫:错,
i活动:0
};
如果(本州){
this.setState(newState);
}否则{
this.state=newState;
}
}
private nextSlideClicked:()=>void=()=>{
如果(this.state.position>min+move){
这是我的国家({
位置:this.state.position-移动,
宽度:numSlides*100,
是的,
伊萨维普雷夫:没错,
isActive:Math.abs((this.state.position-move)/move)
});
}else if((此.state为ICarouselState).position>min){
这是我的国家({
位置:this.state.position-移动,
宽度:numSlides*100,
isActiveNext:false,
伊萨维普雷夫:没错,
isActive:Math.abs((this.state.position-move)/move)
});
}
};
private PrevlideClicked:()=>void=()=>{
如果(此.state.position<0-移动){
这是我的国家({
位置:this.state.position+move,
宽度:numSlides*100,
是的,
伊萨维普雷夫:没错,
isActive:Math.abs((this.state.position+move)/move)
});
}否则如果(this.state.position<0){
这是我的国家({
位置:this.state.position+move,
宽度:numSlides*100,
是的,
伊萨维普雷夫:错,
isActive:Math.abs((this.state.position+move)/move)
});
}
};
私有getCarouseName():carouseName{
返回“名称”
}
})
谢谢。我也遇到了同样的问题。我在每个实例上设置了一个不同的“key”属性,问题就解决了。请发布
旋转木马组件的代码好吗?为什么要使用this.state=newState;
?这可能会导致奇怪的行为…:不要直接改变这个.state,就像调用setState()一样之后可能会替换您所做的变异。将this.state视为不可变。()我设置this.state是因为此调用来自构造函数,其中this.state未初始化。这两个转盘不能同时存在(因此isVisible
是冗余的),你怎么能说他们“处于相同的状态”?如果可能的话,剥离你的组件我知道他们得到的是相同的状态集,因为当我单击其中一个上的“下一步”按钮时,第二个的位置也被设置为该值。也就是说,当第二个的可见性条件变为真时,它将显示与另一个相同的位置,而不是新的位置。谢谢你知道这就是问题所在!我知道当我们使用map()渲染多个元素时的关键,就像它在控制台中抱怨的那样