React Native передает больше реквизита стилю

#reactjs #react-native

#reactjs #react-native

Вопрос:

Я пытаюсь сделать компонент более гибким, но я не могу найти способ передать больше свойств стилю, я думал, что это сработает, но ничего, … morestyles для моего контейнера.

     import React from "react";
    import { StyleSheet, View, Text } from "react-native";
    
    // component
    import Radio from "../components/Radio";
    
    function RadioText({ color, title, ...**moreStyles** }) {
      return (
        <View style={[styles.container, { ...**moreStyles** }]}>
          <Radio color={color} />
          <Text style={styles.text}>{title}</Text>
        </View>
      );
    }
    
    const styles = StyleSheet.create({
      container: {
        flexDirection: "row",
      },
      text: {
        fontSize: 11,
      },
    });
    
    export default RadioText;
  

Ответ №1:

Похоже, что вы распространяете стили в props.

Изменить на:

 function RadioText({ color, title, moreStyles }) {
      return (
        <View style={[styles.container, moreStyles]}>
          <Radio color={color} />
          <Text style={styles.text}>{title}</Text>
        </View>
      );
}
  

Тогда использование было бы:

 <RadioText title="foo" color="red" moreStyles={{padding: 20}} />
  

Если вы хотите продолжать использовать оператор rest, как указано в вашем вопросе, вам придется передавать каждый реквизит стиля следующим образом:

 <RadioText title="foo" color="red" padding={20} />
  

В любом случае нет причин клонировать реквизит moreStyles.

Ответ №2:

Сработает ли что-то подобное?

 <View style={{...styles.container, ...moreStyles}}>
  

Или, может быть, цикл, подобный

 let style = styles.container
moreStyles.forEach((s) => {
    style = {...style, ...s}
})
  

Вот статья, в которой описывается объединение объектов JSON, какими будут стили

Комментарии:

1. Это требует, чтобы вы указали значение по умолчанию для moreStyles в случае, если оно не передается как реквизит. Также не имеет смысла добавлять цикл к вашему компоненту, поскольку RN уже делает это за вас, если вы передаете массив в Views style prop.