#javascript #reactjs #react-native
#javascript #reactjs #react-native
Вопрос:
Ошибка, которую я получаю: [Инвариантное нарушение: [369,»RCTImageView»,31,{«source»:[{«__packager_asset»:true,»width»:52,»height»:80,»uri»:»…assets/assets/glass.png?platform=iosamp;hash=b11854c2a0e54026f26338d7c7cbf7fc?platform=iosamp;dev=trueamp;hot=falseamp;minify=false»,»scale»:1}],»width»:»<>»,»height»:»<>»,»overflow»:»hidden»,»marginTop»:4,»marginHorizontal»:»<>»,»ResizeMode»:»contain»}] не может использоваться в качестве аргумента собственного метода. Похоже, что width, height и marginHorizontal недоступны при рендеринге — я вычисляю эти значения на основе размера экрана, и ошибка исчезает, когда я удаляю динамический стиль. Эта ошибка возникает только при использовании useEffect. Я создаю динамический стиль, основанный на ширине контейнера:
<View
style={styles.container}
onLayout={(event) => {
setContainerWidth(event.nativeEvent.layout.width);
}}
>
{glasses.map(() => glassContainer())}
</View>
Это компонент, который использует динамический стиль.
const ratio = 78 / 50;
const width = containerWidth / 12;
const glassContainer = () => (
<View style={styles.singleGlassContainer}>
<Image
source={require("../../assets/glass.png")}
style={[
styles.glass,
{
width: width,
height: width * ratio,
marginHorizontal: containerWidth / 72,
},
]}
resizeMode="contain"
/>
</View>
);
Затем, наконец, я использую useEffect, как показано ниже
useEffect(() => {
renderGlasses();
}, [hydrationTarget]);
Функция renderGlasses:
const renderGlasses = () => {
//Calculates amounth of glasses to reach target
const targetGlasses = Math.ceil(hydrationTarget / glassVolume);
for (let i = 0; i < targetGlasses; i ) {
setGlasses((prevArray) => [...prevArray, i]);
}
};
Я думаю, что что-то пошло не так, так это то, что useEffect срабатывает до вычисления динамического стиля, но здесь я могу ошибаться. Кто-нибудь знает, что вызывает ошибку, и как ее исправить? Если требуется какой-либо дополнительный код, пожалуйста, дайте мне знать.
Комментарии:
1. как вы получаете ширину контейнера? пробовал использовать useWindowDimensions?
2. @ErikDreifaldt Я использовал onLayout={(событие) => { setContainerWidth(событие.nativeEvent. планировка. ширина); }}
3. я предполагаю, что hydrationTarget является константой с useState? если это так, то использование hydrationTarget в качестве зависимости кажется избыточным, потому что в любом случае он будет повторно отображаться при изменении hydrationTarget. имеет ли стиль styles.glass какие-либо начальные значения для ширины и высоты?
4. hydrationTarget на данный момент все еще разрешен, и нет — я не дал никаких начальных значений, я постараюсь это сделать редактировать: указание начальных значений в объекте таблицы стилей не помогает