![](/img/trans.png)
[英]Reactjs - Update state in child component when parent componend state changes
[英]Update child prop when state changes through parent
我有一個父 state,它有一個“主題”state。
基本上,這是迄今為止的布局。
Parent Component 帶有 Theme 的 state。
父級使用代碼“theme={this.state.theme}”將當前 state 作為“主題”道具傳遞給子組件。
嘗試將子元素設置為內聯樣式
style={{ background: props.theme === "light"? "#fff": "#000" }}
問題是,當父組件 state 更改時,子組件不會更新。 當按下切換按鈕以在亮/暗之間更改 state 時,我控制台記錄父 state。 父 state 更新正常,但內聯樣式沒有改變。 指示子組件在頁面加載時被鎖定到當前的 state 中。
例如,如果默認 state 為“Dark”,則子組件將卡在“Dark”上。 如果我將父 state 切換為“Light”,則子組件將保持“Dark”。
這有什么原因嗎?
如果這是一個菜鳥問題,我很抱歉!
家長
import React, { useState } from "react";
import "./App.scss";
import TweetArea from "./components/TweetArea";
import SwitchTheme from "./components/SwitchTheme";
import Header from "./components/Header";
import html2canvas from "html2canvas";
import { render } from "@testing-library/react";
function screenshot() {
html2canvas(document.querySelector("#tweetHere")).then((canvas) => {
document.body.appendChild(canvas);
});
}
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
theme: "light",
};
}
toggleTheme = (props) => {
this.setState({ theme: this.state.theme === "light" ? "dark" : "light" });
console.log(this.state.theme);
};
themeSwitcher = () => {
const selectedTheme = this.state.theme === "dark" ? "dark" : "";
if (selectedTheme === "dark") {
document.getElementByClass("tweetArea").style.background = "blue";
}
console.log("It ran");
};
render() {
return (
<div className="App">
<button onClick={this.toggleTheme}>Toggle</button>
<SwitchTheme theme={this.state.theme} />
<Header />
<TweetArea selectedTheme={this.state.theme} />
</div>
);
}
}
export default App;
孩子
import React, { useState } from "react";
import Tweet from "./Tweet";
import TweetUsername from "./TweetUsername";
import TweetTitle from "./TweetTitle";
import TweetTime from "./TweetTime";
import TweetData from "./TweetData";
const TweetArea = (props) => {
const [TweetValue, setTweetValue] = useState("");
const TweetHandler = (e) => {
setTweetValue(e.target.value);
};
const [UsernameValue, setUsernameValue] = useState("");
const UsernameHandler = (e) => {
setUsernameValue(e.target.value);
};
const [TitleValue, setTitleValue] = useState("");
const TitleHandler = (e) => {
setTitleValue(e.target.value);
};
const [RetweetValue, setRetweetValue] = useState("");
const RetweetHandler = (e) => {
setRetweetValue(e.target.value);
};
return (
<div class="tweetArea" style={{ background: props.selectedTheme }}>
<div class="innerContainer">
<div className="inputArea">
<div class="tweetInput_tweet">
<h5>Enter your Tweet</h5>
<input type="text" class="onTweet" onChange={TweetHandler} />
</div>
<div class="tweetInput_username">
<h5>What is the username</h5>
<input type="text" onChange={UsernameHandler} />
</div>
<div class="tweetInput_title">
<h5>What is the title</h5>
<input type="text" onChange={TitleHandler} />
</div>
<div class="tweetInput_retweet">
<h5>What is the retweet count</h5>
<input type="text" onChange={RetweetHandler} />
</div>
</div>
<div
class="tweet"
id="tweetHere"
style={{ background: props.theme === "light" ? "#fff" : "#000" }}
>
<div class="tweet_header">
<div class="tweet_avatar">
<img
src="https://via.placeholder.com/50"
alt="avatar"
class="avatar"
/>
</div>
<div class="tweet_person">
<TweetTitle TitleValue={TitleValue} />
<TweetUsername UsernameValue={UsernameValue} />
</div>
</div>
<Tweet TweetValue={TweetValue} />
<TweetTime />
<TweetData RetweetValue={RetweetValue} />
</div>
</div>
</div>
);
};
export default TweetArea;
道具被selectedTheme
主題
<TweetArea selectedTheme={this.state.theme} />
你已經使用props.theme
它應該是props.selectedTheme
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.