【发布时间】:2021-01-12 06:30:46
【问题描述】:
抱歉,我是 React 新手。我正在尝试建立一个基本的社交网络来学习反应。 语境: 当我点击“like”按钮时,setState 应该调用该函数来更新我的组件的状态,但它只有在我刷新页面时才会更新。我认为 ComponentDidUpdate 函数没有像应有的那样被调用。我做错了什么?感谢您的帮助!
以下是部分代码:
点赞按钮组件:
class Like_Button extends React.Component {
constructor(props) {
super(props);
this.state = {liked : "Like"};
}
isliked(){
fetch("likes_of_user/")
.then(res => res.json())
.then((result) => {
result.map(x => {if(this.props.pk == x.liked_post){this.setState({liked: "Unlike"});}});
})
}
componentDidMount() {
this.isliked();
}
componentDidUpdate(prevProps, prevState) {
if (prevState.liked !== this.state.liked) {
this.isliked();
}
}
render() {
return (
<button className = "buttons" onClick={() => {
var csrftoken = getCookie('csrftoken');
fetch(`like_post/${this.props.pk}`, {method: "POST", headers: {'Accept': 'application/json', 'Content-Type': 'application/json','X-CSRFToken': csrftoken}})
}}>{this.state.liked}</button>
)
}
}
新闻源组件:
class Newsfeed_comp extends React.Component {
constructor(props) {
super(props);
this.state = {
error: null,
isLoaded: false,
items: []
};
}
componentDidMount() {
fetch("get_newsfeed/")
.then(res => res.json())
.then(
(result) => {
this.setState({
isLoaded: true,
items: result
});
},
(error) => {
this.setState({
isLoaded: true,
error
});
}
)
}
render() {
const { error, isLoaded, items } = this.state;
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return <div>Loading...</div>;
} else {
return (
<ul>
{items.map((item ,index) => (
<li className="postbox" key={`${item}${index}`}>
{item.author}
{item.date}
{item.content}
<Like_Button pk={item.id} />
</li>
))}
</ul>
);
}
}
}
ReactDom 渲染:
ReactDOM.render(<Newsfeed_comp />, document.getElementById("newsfeed_view"))
【问题讨论】:
-
将 setState 与回调函数一起使用。 this.setState((state) => {...state, isLoaded: true});
标签: javascript reactjs components