Как изменить стиль оформления TextInput в React Native?

Есть ли способ установить fontStyle: 'italic' только для placeholder TextInput in React Native?

выглядит здесь, в документации, кажется, что вы можете установить только placeholder и placeholderTextColor.

Ответы

Ответ 1

Улучшение ответа Даниэля для более общего решения

class TextInput2 extends Component {
  constructor(props) {
    super(props);
    this.state = { placeholder: props.value.length == 0 }
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(ev) {
    this.setState({ placeholder: ev.nativeEvent.text.length == 0 }); 
    this.props.onChange && this.props.onChange(ev); 
  }
  render() {
    const { placeholderStyle, style, onChange, ...rest } = this.props;

    return <TextInput 
      {...rest} 
      onChange={this.handleChange}
      style={this.state.placeholder ? [style, placeholderStyle] : style}
      />
  }
}

Использование:

<TextInput2 
  text={this.state.myText}
  style={{ fontFamily: "MyFont" }}
  placeholderStyle={{ fontFamily: "AnotherFont", borderColor: 'red' }}
/>

Ответ 2

Вы можете установить цвет заполнителя, используя placeholderTextColor.

<TextInput placeholderTextColor={'red'} />

Ответ 3

Вы можете создать эту функцию самостоятельно. Заполнитель отображается, когда ввод пуст, поэтому вы можете проверить свое состояние и соответственно изменить fontStyle:

<TextInput
  onChangeText={txt => this.setState({enteredText: txt})}
  fontStyle={this.state.enteredText.length == 0 ? 'italic' : 'normal'}
  style={style.input} />

По некоторым причинам это, кажется, не работает с fontFamily = System. Таким образом, вы должны явно указать fontFamily.

Ответ 4

Содержимое и placeHolder of TextInput используют общий стиль, поэтому вы можете установить fontWeight и fontSize для placeHolder. Для другого вы можете установить свойство placeholderTextColor для TextInput

Ответ 5

Вы также можете использовать компонент без сохранения состояния.

Вот мое решение:

Во-первых, в моем компоненте экрана...

import React from 'react';
import { View } from 'react-native';
import MyWrappedComponent from '../wherever/your/components/are/MyWrappedComponent';

class ScreenComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      myText: null,
    };
    this.handleTextOnChange = this.handleTextOnChange.bind(this);
  }

  handleTextOnChange(myText) {
    this.setState({ myText });
  }

  render() {
    const { myText } = this.state

  return (
    <View>
      <MyWrappedComponent            
        value={myText}
        placeholder="My Placeholder Text"
        onChangeText={this.handleTextOnChange}
        style={styles.someStyle}
        placeholderStyle={style.somePlaceholderStyle}
      />
    </View>
  )
}

Затем в моем завернутом компоненте...

import React from 'react';
import { TextInput } from 'react-native-gesture-handler';

const MyWrappedComponent = ({
  style,
  placeholderStyle,
  value,
  ...rest
}) => (
  <TextInput
    {...rest}
    style={!value ? [style, placeholderStyle] : style}
  />
);

export default MyWrappedComponent;

Ответ 6

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

<View style={{
    flex: 0.3,
    alignContent: "center",
    justifyContent: "center",
    alignSelf: "center"
    }}>

это позволит заполнителю выравниваться по центру, так как иногда "alignContent", "alignItems", "justifyContent" могут не работать. Также:

inputContainerStyle={{
                    borderColor: 'transparent'
                }}

стилизовать любые граничные линии (вышеприведенная убирает все границы, возникающие от'act-native-elements ').