React Native 多次重新渲染 3 个状态的错误
React Native many re-renders error for 3 state
错误:重新呈现太多。 React 限制渲染次数以防止无限循环。
我的目标是随着国家的更新使城市数据保持最新。
我收到此错误如何在此代码中修复它?
const [selectedCity, setSelectedCity] = useState({})
const [selectedCountry, setSelectedCountry] = useState({})
const [cityData,setCityData]= useState(TurkeyCityData)
function onChangeCity() {
return (val) => setSelectedCity(val)
}
function onChangeCountry() {
setCityData(`${selectedCountry.item}${'CityData'}`)
return (val)=>setSelectedCountry(val);
}
//`${selectedCountry.item}${'CityData'}`
return (
<View style={styles.container}>
<View style={styles.header}>
<SelectBox
label=''
options={countryData}
value={selectedCountry}
onChange={onChangeCountry()}
hideInputFilter={false}
width={width/2.5}
containerStyle={styles.selectbox}
arrowIconColor='#5359d1'
searchIconColor='#5359d1'
inputPlaceholder='Ülke Seç'
/>
在您分享的linked example中,处理程序代码是:
function onChange() {
return (val) => setSelectedTeam(val)
}
此 return 是一个状态设置函数,用作 onChange={onChange()}
的更改处理程序。
在您的代码中,您像他们一样return一个处理程序,但您也立即设置状态:
function onChangeCountry() {
setCityData(`${selectedCountry.item}${'CityData'}`) // <-- triggers rerender
return (val)=>setSelectedCountry(val);
}
任何状态集都必须有某种条件或触发机制,否则您将获得无限的重新渲染循环。您可以使用效果或将 setter 放入处理程序回调中,以对您的应用程序逻辑更有意义的为准:
function onChangeCountry() {
return val => {
setSelectedCountry(val);
setCityData(`${selectedCountry.item}${'CityData'}`);
};
}
顺便说一句,我不确定额外的抽象层在这里是否有意义;我只使用一个不那么令人困惑的函数:
function onChangeCountry(val) {
setSelectedCountry(val);
setCityData(`${selectedCountry.item}${'CityData'}`);
}
并将其用于:
onChange={onChangeCountry}
或者,重命名该函数 makeOnChangeCountryHandler()
以便清楚该函数不是处理程序本身;相反,它 returns/creates/makes 调用时的处理程序。
错误:重新呈现太多。 React 限制渲染次数以防止无限循环。 我的目标是随着国家的更新使城市数据保持最新。 我收到此错误如何在此代码中修复它?
const [selectedCity, setSelectedCity] = useState({})
const [selectedCountry, setSelectedCountry] = useState({})
const [cityData,setCityData]= useState(TurkeyCityData)
function onChangeCity() {
return (val) => setSelectedCity(val)
}
function onChangeCountry() {
setCityData(`${selectedCountry.item}${'CityData'}`)
return (val)=>setSelectedCountry(val);
}
//`${selectedCountry.item}${'CityData'}`
return (
<View style={styles.container}>
<View style={styles.header}>
<SelectBox
label=''
options={countryData}
value={selectedCountry}
onChange={onChangeCountry()}
hideInputFilter={false}
width={width/2.5}
containerStyle={styles.selectbox}
arrowIconColor='#5359d1'
searchIconColor='#5359d1'
inputPlaceholder='Ülke Seç'
/>
在您分享的linked example中,处理程序代码是:
function onChange() {
return (val) => setSelectedTeam(val)
}
此 return 是一个状态设置函数,用作 onChange={onChange()}
的更改处理程序。
在您的代码中,您像他们一样return一个处理程序,但您也立即设置状态:
function onChangeCountry() {
setCityData(`${selectedCountry.item}${'CityData'}`) // <-- triggers rerender
return (val)=>setSelectedCountry(val);
}
任何状态集都必须有某种条件或触发机制,否则您将获得无限的重新渲染循环。您可以使用效果或将 setter 放入处理程序回调中,以对您的应用程序逻辑更有意义的为准:
function onChangeCountry() {
return val => {
setSelectedCountry(val);
setCityData(`${selectedCountry.item}${'CityData'}`);
};
}
顺便说一句,我不确定额外的抽象层在这里是否有意义;我只使用一个不那么令人困惑的函数:
function onChangeCountry(val) {
setSelectedCountry(val);
setCityData(`${selectedCountry.item}${'CityData'}`);
}
并将其用于:
onChange={onChangeCountry}
或者,重命名该函数 makeOnChangeCountryHandler()
以便清楚该函数不是处理程序本身;相反,它 returns/creates/makes 调用时的处理程序。