reactjs - 反应:当元素为真时无法显示按钮
问题描述
这是我的代码:
const Agregar = ({inputPregunta, validatePregunta}) => {
return(
<div id="content">
<h2>¿Cual es tu pregunta?</h2>
<input id="valorPregunta" type="text" placeholder="Añade aqui tu pregunta..." onChange={(e) => inputPregunta(e)}/>
{validatePregunta && <button>Agregar</button>}
</div>
);
}
我想要做的是当输入有东西输入时,prop validatePregunta(默认为 false)变为 true 并且按钮元素显示,因为我试图在 App.js 文件中执行如下方法:
actualizarPregunta = (e) => {
this.setState({inputPregunta: e.target.value})
if(this.state.inputPregunta.trim().length > 0){
this.setState({validatePregunta: true})
} else {
this.setState({validatePregunta: false})
}
}
但是没有显示,我做错了什么吗?
编辑:这是道具渲染的代码:
renderRoute = () => {
switch(this.state.route) {
case 'menu':
return (
<div>
<Header />
<Agregar inputPregunta={this.actualizarPregunta} validate={this.state.validatePregunta}/>
<Publications />
</div>
)
default :
return (
<div>
<Header />
<Publications />
</div>
)
}
}
render() {
return (
<div>
{
this.renderRoute(this.state.route)
}
</div>
);
}
解决方案
第一期
道具不对齐。
组件签名是const Agregar = ({inputPregunta, validatePregunta})
但是你通过validate={this.state.validatePregunta}
.
<Agregar
inputPregunta={this.actualizarPregunta}
validate={this.state.validatePregunta}
/>
解决方案
对齐道具名称的使用。
<Agregar
inputPregunta={this.actualizarPregunta}
validatePregunta={this.state.validatePregunta}
/>
第 2 期
React 组件状态生命周期。入队状态试图在入队的同一个反应循环中被引用。您需要在下一个渲染周期之前不可用的入队值。
actualizarPregunta = (e) => {
this.setState({ inputPregunta: e.target.value }); // <-- state update enqueued
if (this.state.inputPregunta.trim().length > 0){ // <-- current state value
this.setState({ validatePregunta: true })
} else {
this.setState({ validatePregunta: false })
}
}
解决方案 1
将状态更新入队并使用当前事件值设置其他状态
actualizarPregunta = (e) => {
const { value } = e.target;
this.setState({
inputPregunta: value,
validatePregunta: !!value.trim().length, // <-- *
});
}
* length == 0 为假,length !== 0 为真,并强制为 boolean ( !!
)
解决方案 2
将状态更新入队并使用componentDidUpdate
生命周期函数来处理效果
actualizarPregunta = (e) => {
const { value } = e.target;
this.setState({ inputPregunta: value });
}
componentDidUpdate(prevProps, prevState) {
const { inputPregunta } = this.state;
if (prevState.inputPregunta !== inputPregunta) {
this.setState({ validatePregunta: !!inputPregunta.trim().length });
}
}
解决方案#1 更简单、更直接。
推荐阅读
- embedded - Cortex M3 从应用程序跳转回引导加载程序并返回到应用程序
- java - Slenium-Java:Wait.until(ExpectedConditions.invisibilityOfElementLocated()) 对于负面情况总是失败
- regex - 正则表达式(PCRE)从匹配结果中排除某些单词
- c - 结构中的指针指向另一个结构
- git - 如何将预提交挂钩推送到所有现有存储库
- python - 如何根据张量流中的条件设置每个单独的矩阵值
- typescript - Typescript 类型保护:使用 in 运算符
- python - 哪个更贵?变异对象或创建新对象?
- c# - 单元测试,大型设置/夹具
- bash - 文件文本替换