5 回答

TA貢獻1840條經(jīng)驗 獲得超5個贊
此警告是在 React V16.3.0 之后引入的。
如果您使用的是功能組件,則可以將 setState 調用包裝到使用效果中。
不起作用的代碼:
const HomePage = (props) => {
props.setAuthenticated(true);
const handleChange = (e) => {
props.setSearchTerm(e.target.value.toLowerCase());
};
return (
<div key={props.restInfo.storeId} className="container-fluid">
<ProductList searchResults={props.searchResults} />
</div>
);
};
現(xiàn)在,您可以將其更改為:
const HomePage = (props) => {
// trigger on component mount
useEffect(() => {
props.setAuthenticated(true);
}, []);
const handleChange = (e) => {
props.setSearchTerm(e.target.value.toLowerCase());
};
return (
<div key={props.restInfo.storeId} className="container-fluid">
<ProductList searchResults={props.searchResults} />
</div>
);
};

TA貢獻1818條經(jīng)驗 獲得超11個贊
只是來這里是因為我剛剛遇到了這個問題,在我意識到我做錯了什么之前,我花了一點時間去挖掘 - 我只是沒有注意我如何編寫我的功能組件。
我想我會在這里留下一個答案,以防有人來找,他們犯了和我一樣簡單的錯誤。
我正在這樣做:
const LiveMatches = (props: LiveMatchesProps) => {
const {
dateMatches,
draftingConfig,
sportId,
getDateMatches,
} = props;
if (!dateMatches) {
const date = new Date();
getDateMatches({ sportId, date });
};
return (<div>{component stuff here..}</div>);
};
我只是忘記了使用,然后發(fā)送我的 redux 呼叫useEffectgetDateMatches()
太愚蠢了,我在所有其他組件中都一直在做的事情,哈哈。
所以它應該是:
const LiveMatches = (props: LiveMatchesProps) => {
const {
dateMatches,
draftingConfig,
sportId,
getDateMatches,
} = props;
useEffect(() => {
if (!dateMatches) {
const date = new Date();
getDateMatches({ sportId, date });
}
}, [dateMatches, getDateMatches, sportId]);
return (<div>{component stuff here..}</div>);
};
簡單而愚蠢的錯誤,但花了一段時間才意識到這一點,所以希望這有助于其他人解決這個問題。

TA貢獻1831條經(jīng)驗 獲得超10個贊
請仔細閱讀錯誤消息,我的指向具有錯誤設置狀態(tài)的登錄組件。當我檢查時,我有一個不是Arrow函數(shù)的onpress。
就像這樣:
onPress={navigation.navigate("Home", { screen: "HomeScreen" })}
我把它改成了這樣:
onPress={() => navigation.navigate("Home", { screen: "HomeScreen" }) }
我的錯誤消息是:
警告:在呈現(xiàn)其他組件 () 時無法更新組件 ()。若要在 內(nèi)部找到錯誤的 setState() 調用,請按照登錄(在登錄屏幕.tsx:20)中的 https://reactjs.org/link/setstate-in-render 中所述的堆棧跟蹤進行操作。
ForwardRef(BaseNavigationContainer)
SignIn
SignIn

TA貢獻1783條經(jīng)驗 獲得超4個贊
我通過將調度從寄存器組件呈現(xiàn)方法刪除到組件卸載方法來解決此問題。這是因為我希望在重定向到登錄頁面之前發(fā)生此邏輯。一般來說,最好的做法是將所有邏輯放在渲染方法之外,這樣我的代碼以前寫得很糟糕。希望這對將來的其他人有所幫助:)
我重構的寄存器組件:
class Register extends Component {
componentWillUnmount() {
// Reset register status to allow return to register page
if ( this.props.registerStatus !== "" ) this.props.dispatch( resetRegisterStatus() )
}
render() {
if( this.props.registerStatus === SUCCESS ) {
return <Redirect push to = {LOGIN}/>
}
return (
<div style = {{paddingTop: "180px", background: 'radial-gradient(circle, rgba(106,103,103,1) 0%, rgba(36,36,36,1) 100%)', height: "100vh"}}>
<RegistrationForm/>
</div>
);
}
}

TA貢獻1831條經(jīng)驗 獲得超9個贊
如果使用效果無法在您的案例中使用,或者錯誤不是由于 Redux
我曾經(jīng)將兩個變量中的一個重定向到回調隊列。setTimeoutuseState
我有一個父組件和一個子組件,每個組件中都有變量。解決方案是使用 包裝變量:useStateuseStatesetTimeout
setTimeout(() => SetFilterData(data), 0);
以下示例
父組件
import ExpenseFilter from '../ExpensesFilter'
function ExpensesView(props) {
const [filterData, SetFilterData] = useState('')
const GetFilterData = (data) => {
// SetFilterData(data);
//*****WRAP useState VARIABLE INSIDE setTimeout WITH 0 TIME AS BELOW.*****
setTimeout(() => SetFilterData(data), 0);
}
const filteredArray = props.expense.filter(expenseFiltered =>
expenseFiltered.dateSpent.getFullYear().toString() === filterData);
return (
<Window>
<div>
<ExpenseFilter FilterYear = {GetFilterData}></ExpenseFilter>
子組件
const ExpensesFilter = (props) => {
const [filterYear, SetFilterYear] = useState('2022')
const FilterYearListener = (event) => {
event.preventDefault()
SetFilterYear(event.target.value)
}
props.FilterYear(filterYear)
return (
添加回答
舉報