Подтвердить что ты не робот

Сделать вид 80% -ной ширины родительского в React Native

Я создаю форму в React Native и хотел бы сделать мой TextInput 80% ширины экрана.

С HTML и обычным CSS это было бы просто:

input {
    display: block;
    width: 80%;
    margin: auto;
}

За исключением того, что React Native не поддерживает свойство display, процентную ширину или автоматическое поле.

Так что же мне делать? Там некоторое обсуждение этой проблемы в React Native issue tracker, но предлагаемые решения кажутся неприятными хаками.

4b9b3361

Ответ 1

Это должно соответствовать вашим потребностям:

var yourComponent = React.createClass({
    render: function () {
        return (
            <View style={{flex:1, flexDirection:'column', justifyContent:'center'}}>
                <View style={{flexDirection:'row'}}>
                    <TextInput style={{flex:0.8, borderWidth:1, height:20}}></TextInput>
                    <View style={{flex:0.2}}></View> // spacer
                </View>
            </View>
        );
    }
});

Ответ 2

Если вы просто хотите сделать ввод относительно ширины экрана, простым способом было бы использовать Dimensions:

// De structure Dimensions from React
var React = require('react-native');
var {
  ...
  Dimensions
} = React; 

// Store width in variable
var width = Dimensions.get('window').width; 

// Use width variable in style declaration
<TextInput style={{ width: width * .8 }} />

Я создал рабочий проект здесь. Код также ниже.

https://rnplay.org/apps/rqQPCQ

'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  TextInput,
  Dimensions
} = React;

var width = Dimensions.get('window').width;

var SampleApp = React.createClass({
  render: function() {
    return (
      <View style={styles.container}>
        <Text style={{fontSize:22}}>Percentage Width In React Native</Text>
        <View style={{marginTop:100, flexDirection: 'row',justifyContent: 'center'}}>
            <TextInput style={{backgroundColor: '#dddddd', height: 60, width: width*.8 }} />
          </View>
      </View>
    );
  }
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop:100
  },

});

AppRegistry.registerComponent('SampleApp', () => SampleApp);

Ответ 3

По отношению к Реальному 0.42 height: и width: принимать проценты.

введите описание изображения здесь

  • Рабочий пример в Expo Snack:
    Ширина/высота ребенка как пропорция родителя

  • Код в случае, если пример уходит.

    import React, { Component } from 'react';
    import { Text, View, StyleSheet } from 'react-native';
    
    const width = '80%';
    const height = '40%';
    
    export default class App extends Component {
        render() {
            return (
                <View style={styles.screen}>
                    <View style={styles.box}>
                        <Text style={styles.text}>
                            {width} of width{'\n'}
                            {height} of height
                        </Text>
                    </View>
                </View>
            );
        }
    }
    
    const styles = StyleSheet.create({
        screen: {
            flex: 1,
            alignItems: 'center',
            justifyContent: 'center',
            backgroundColor: '#7AC36A',
        },
        box: {
            width,
            height,
            alignItems: 'center',
            justifyContent: 'center',
            backgroundColor: '#F3D1B0',
        },
        text: {
            fontSize: 18,
        },
    });
    

Ответ 4

Вы также можете попробовать react-native-extended-stylesheet, который поддерживает процент для приложений с одной ориентацией:

import EStyleSheet from 'react-native-extended-stylesheet';

const styles = EStyleSheet.create({
  column: {
    width: '80%',
    height: '50%',
    marginLeft: '10%'
  }
});

Ответ 5

Метод, который я использую для процентной ширины родительского объекта, добавляет дополнительный спейсер в сочетании с некоторым flexbox. Это не относится ко всем сценариям, но может быть очень полезно.

Итак, идем:

class PercentageWidth extends Component {
    render() {
        return (
            <View style={styles.container}>
                <View style={styles.percentageWidthView}>
                    {/* Some content */}
                </View>

                <View style={styles.spacer}
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flexDirection: 'row'
    },

    percentageWidthView: {
        flex: 60
    },

    spacer: {
        flex: 40
    }
});

В основном свойство flex - это ширина относительно "общего" изгиба всех элементов в контейнере flex. Поэтому, если все предметы составляют 100, у вас есть процент. В этом примере я мог бы использовать значения flex 6 и 4 для одного и того же результата, поэтому он еще больше FLEXible.

Если вы хотите центрировать процентную ширину: добавьте две проставки с половиной ширины. Так что в примере это будет 2-6-2.

Конечно, добавление дополнительных просмотров - это не самая приятная вещь в мире, но в приложении реального мира я могу представить, что spacer будет содержать различный контент.

Ответ 6

Так я получил решение. Простой и сладкий. Независимо от плотности экрана:

export default class AwesomeProject extends Component {
    constructor(props){
        super(props);
        this.state = {text: ""}
    }
  render() {
    return (
       <View
          style={{
            flex: 1,
            backgroundColor: "#ececec",
            flexDirection: "column",
            justifyContent: "center",
            alignItems: "center"
          }}
        >
          <View style={{ padding: 10, flexDirection: "row" }}>
            <TextInput
              style={{ flex: 0.8, height: 40, borderWidth: 1 }}
              onChangeText={text => this.setState({ text })}
              placeholder="Text 1"
              value={this.state.text}
            />
          </View>
          <View style={{ padding: 10, flexDirection: "row" }}>
            <TextInput
              style={{ flex: 0.8, height: 40, borderWidth: 1 }}
              onChangeText={text => this.setState({ text })}
              placeholder="Text 2"
              value={this.state.text}
            />
          </View>
          <View style={{ padding: 10, flexDirection: "row" }}>
            <Button
              onPress={onButtonPress}
              title="Press Me"
              accessibilityLabel="See an Information"
            />
          </View>
        </View>
    );
  }
}