javascript - setState 后组件未重新渲染
问题描述
import Header from './components/Header';
import Bio from './components/Bio';
import styled from 'styled-components';
import Photo from './components/Photo';
class App extends Component {
constructor(props) {
super(props);
this.state = {
name: "John Smith",
job: "Noob Developer",
email: "John@Smith.noob",
university: "Harvard University",
study: "Law",
year: "2020",
experience: ["Google","Facebook","Airbnb"],
input: false,
}
this.switchShow = this.switchShow.bind(this);
}
switchShow () {
this.setState( prevState => ({
input: !prevState.input
}))
console.log(this.state.input)
}
render() {
let {name,job,email,university,study,year,experience,input} = this.state
return(
<div className="App">
<Header/>
<FlexRowContainer>
<EditButton onClick={this.switchShow}>Edit</EditButton>
<Photo/>
<Bio name={name} job={job} email={email} school={university} study={study} year={year} experience={experience} input={input}>
</Bio>
</FlexRowContainer>
</div>
)
}
}
export default App;
const FlexRowContainer = styled.div`
display: flex;
width: 100%;
flex-direction: row;
justify-content: center;
`
const EditButton = styled.button`
float: right;
width: auto;
height: auto;
position: absolute;
border: transparent;`
所以我尝试使用 switchShow 方法更改 this.state.input 并且更改后组件没有呈现,即使当我 console.log(this.state.input) 它成功地从 false 更改为 true 或再次单击时它会更改再次从真到假。有什么不对的吗?
生物组件在这里
import styled from 'styled-components'
class Bio extends Component {
constructor(props) {
super(props)
this.state = {
name: this.props.name,
job: this.props.job,
email: this.props.email,
school: this.props.school,
study: this.props.study,
yearClass: this.props.year,
experience: this.props.experience,
input: this.props.input,
};
}
render() {
let {name,job,email,school,study,yearClass,experience,input} = this.state
return (
<div>
<StyledBioContainer>
<StyledSubtitle>Name</StyledSubtitle>
{ !input ? <StyledParagraph>{name}</StyledParagraph> : <input></input>}
<StyledSubtitle>Job</StyledSubtitle>
{ !input ? <StyledParagraph>{job}</StyledParagraph> : <input></input>}
<StyledSubtitle>Email</StyledSubtitle>
{ !input ? <StyledParagraph>{email}</StyledParagraph> : <input></input>}
<StyledSubtitle>School</StyledSubtitle>
{ !input ? <StyledParagraph>{school}</StyledParagraph> : <input></input>}
<StyledSubtitle>Title of Study</StyledSubtitle>
{ !input? <StyledParagraph>{study}</StyledParagraph> : <input></input>}
<StyledSubtitle>Class</StyledSubtitle>
{ !input? <StyledParagraph>{yearClass}</StyledParagraph> : <input></input>}
<StyledSubtitle>Experiences</StyledSubtitle>
{ !input? experience.map(experience => <StyledParagraph>{experience}</StyledParagraph>) : <input></input>}
</StyledBioContainer>
</div>
)
}
}
export default Bio;
const StyledBioContainer = styled.div`
display: flex;
font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
flex-direction: column;
width: 100%;
padding: 3rem;
color: black;
height: auto;
background-color: rgba(0,105,255,.05);
text-align: center;
border-radius: 3px;
margin-top: 1.5rem;
`
const StyledSubtitle = styled.h6`
font-family: Verdana, Geneva, Tahoma, sans-serif;
font-size: 12px;
margin-top: 10px;
margin-bottom: 0px;
color: gray;
`
const StyledParagraph = styled.p`
margin-top: 0.75rem;
margin-bottom: 5px;
font-size: 20px;
解决方案
问题是在 Bio 组件中,您将 props 分配给构造函数中的状态变量,然后对 Bio 的状态进行条件渲染。创建组件时,它会获取道具并将它们分配给状态,但是当您更改道具时,构造函数将不再被调用。
您可以跳过从道具设置状态并在渲染中使用道具,或者如果您想使用类组件,您可以调用 componentDidUpdate,并使用新道具更新您的状态。
这是在 Bio 组件中使用道具而不是状态进行条件渲染的工作示例
https://codesandbox.io/s/focused-rosalind-8rnih?file=/src/Bio.jsx
推荐阅读
- python - Python类方法:从一个类中提取八个属性中的两个并分配给一个列表
- reactjs - 如何在 react-dropdown 组件中对选项进行 onclick
- python - 如何使用元组制作散点图
- javascript - 如何比较单个数组项?
- python - 如何在 Python 中获取文件的行数
- python - 是否可以在格式函数中传递函数?以错误代码零退出的代码
- database - 通过从备份中提取配置来恢复 marklogic 数据库
- java - 将图像从 URL 复制到 HTTP URL
- node.js - 使用 Node.js 在 Return 语句中包含标头和数据数组
- python - Seaborn:使用 lmplot 时如何在所有绘图中指定绘图次要刻度线和网格线?