如何在有条件的情况下改变状态 - React
Posted
技术标签:
【中文标题】如何在有条件的情况下改变状态 - React【英文标题】:How to change the state in conditional - React 【发布时间】:2019-09-02 20:58:57 【问题描述】:我需要更改我的 React 应用程序中同级组件的状态。 我使用 state 和 setstate
我需要更改兄弟组件的状态。加载页面时,必须存在(在页面中可见)<BkUser />
,点击“按钮 id =”ds-visual 时,必须删除(<BkUser />
不能存在)并且必须存在<BkDescanso />
。
当您单击 <BkSleep />
(在 div 父级中)时,您应该删除 <BkDescanso />
并显示 <BkUser />
This is the web.
There should never be <BkUser/>
and <BkSleep>
at the same time. <Bkuser />
is the blue block and <BkDescanso />
is the red block
这是我的代码:
编辑:我编辑我的原始代码是因为我解决了问题。这是最终的 OK 代码。最后最重要的是状态条件
this.state.usuario ? (<BkUser handleClick = this.handleClick usuario=this.state.usuario/>): (<BkDescanso handleClick = this.handleClick usuario=this.state.usuario/>)
import React, Component from 'react';
class Header extends Component
constructor(props)
super(props);
this.state =
usuario: true,
;
this.handleClick = this.handleClick.bind(this);
handleClick()
this.setState(state => (
usuario: !state.usuario
));
//alert("Works button");
render()
return (
<header className="header">
<div className="configuracion">
this.state.usuario
? (
<BkUser handleClick = this.handleClick usuario=this.state.usuario/>
)
: (
<BkDescanso handleClick = this.handleClick usuario=this.state.usuario/>
)
<div className="content-btn">
<button id="config" className='btn btn--rounded'><span className="ico-configuracion"></span></button>
<button id="salir" className='btn btn--rounded'><span className="ico-exit"></span></button>
</div>
</div>
</header>
);
class BkUser extends Component
render()
return ((
<div className='usuario'>
<img src="../img//usuario.svg" />
<div className="content-usuario">
<span id="nm-usuario" className="h4">Hermione Jane Granger</span>
<span id="tp-usuario" className="h5">Supervisor</span>
</div>
<div className="content-descansos">
<div className="botones">
<button id="ds-visual" className='btn btn--rounded' onClick=this.props.handleClick><span className="ico-visual"></span></button>
<button id="ds-admin" className='btn btn--rounded'><span className="ico-tiempo-administrativo"></span></button>
<button id="ds-otros" className='btn btn--rounded'><span className="ico-descanso"></span></button>
</div>
<div className="ds-actual">
<span id="ds-tipo">Administrativo</span>
<span id="ds-tiempo">00:08:47</span>
</div>
</div>
</div>
));
class BkDescanso extends Component
render()
return ((
<div className='usuario descanso' onClick=this.props.handleClick>
<h3>Finalizar descanso</h3>
</div>
));
export default Header;
现在 handleClick 工作,但始终存在 BkUser 和 BkDescanso。我只需要一个存在。如果单击 id = "ds-visual",bkUser 块应该会消失并出现 BkDescanso。然后,如果您在 BkUser 中单击 div className = 'user rest',则应该只有 BkDescanso。
我认为它无法知道什么时候是真的,什么时候是假的显示或隐藏
非常感谢您的帮助。
【问题讨论】:
最好将孩子的状态数据处理到父组件中。因此,每当您单击子项中的按钮时,只需在父项中使用 this.props.functionName 调用一个函数并更新父项中的状态,这将导致整个组件的重新渲染。 【参考方案1】:你错过了两件事:
首先您必须将handleClick
函数传递给BkUser
组件,然后您必须通过this.props.handleClick
调用它。
...
<BkUser handleClick=this.handleClick usuario=this.state.usuario />
....
<button
id="ds-visual"
className="btn btn--rounded"
onClick=this.props.handleClick
>
ds-visual
<span className="ico-visual" />
</button>
CodeSandbox here.
Read more here.
【讨论】:
非常感谢!现在 handleClick 工作,但始终存在 BkUser 和 BkDescanso。我只需要一个存在。如果您单击 id = "ds-visual",bkUser 块应该会消失并且 BkDescanso 会出现。然后,如果您在 BkUser 中单击 div className = 'user rest',则应该只有 BkDescanso。我编辑您的更改。再次感谢。【参考方案2】:你可以通过 props 从父级传递一个函数来改变兄弟姐妹的状态。
最后你的兄弟姐妹是他们父母的孩子。
您可以阅读这篇文章,了解如何更改子组件的状态。
React js change child component's state from parent component
https://medium.freecodecamp.org/react-changing-state-of-child-component-from-parent-8ab547436271
您可以研究的另一件事是 React Redux。
【讨论】:
谢谢杰蜂。我已尝试按照您推荐的网址的步骤进行操作,但仍然无法正常工作。 你做了什么,结果如何。您能否编辑您的问题以明确您想要达到的目标。在您的以下句子中缺少您对程序的期望:“加载页面时,必须有并且当单击”按钮 id =“ds-visual”时,它必须被删除()并且必须有。 " 我编辑了这个问题。我希望你现在明白了。对不起我的英语。以上是关于如何在有条件的情况下改变状态 - React的主要内容,如果未能解决你的问题,请参考以下文章
如何在不改变位置的情况下调整同一行中的两个 React 日期选择器
如何在没有 Redux 的情况下将状态保存在本地存储 React 中?