Сделать вид 80% -ной ширины родительского в React Native
Я создаю форму в React Native и хотел бы сделать мой TextInput
80% ширины экрана.
С HTML и обычным CSS это было бы просто:
input {
display: block;
width: 80%;
margin: auto;
}
За исключением того, что React Native не поддерживает свойство display
, процентную ширину или автоматическое поле.
Так что же мне делать? Там некоторое обсуждение этой проблемы в React Native issue tracker, но предлагаемые решения кажутся неприятными хаками.
Ответы
Ответ 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>
);
}
}