ดูความกว้าง 80% ของพาเรนต์ใน React Native


105

ฉันกำลังสร้างแบบฟอร์มใน React Native และต้องการทำให้TextInput80% ของความกว้างหน้าจอ

ด้วย HTML และ CSS ธรรมดาสิ่งนี้จะตรงไปตรงมา:

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

ยกเว้นว่า React Native ไม่รองรับdisplayคุณสมบัติเปอร์เซ็นต์ความกว้างหรือระยะขอบอัตโนมัติ

แล้วฉันจะทำอย่างไรดี? มีการอภิปรายเกี่ยวกับปัญหานี้ในเครื่องมือติดตามปัญหาของ React Native แต่วิธีแก้ปัญหาที่เสนอดูเหมือนเป็นการแฮ็กที่น่ารังเกียจ


1
react-nativeใช้flexสำหรับขนาดและตำแหน่งขององค์ประกอบ ผมไม่แน่ใจ แต่อาจจะflex-basisเป็นสิ่งที่คุณต้องการ: การตรวจสอบนี้และนี้
Alix

1
และตามปัญหานี้บางสิ่งบางอย่างเช่นflex: 0.8อาจจะทำงาน
alix

คำตอบ:


96

เมื่อ React Native 0.42 height:และwidth:ยอมรับเปอร์เซ็นต์

ใช้width: 80%ในสไตล์ชีตของคุณและใช้งานได้จริง

  • ภาพหน้าจอ

  • ตัวอย่าง
    ความกว้าง / ความสูงของเด็กตามสัดส่วนของผู้ปกครอง

  • รหัส

    import React from 'react';
    import { Text, View, StyleSheet } from 'react-native';
    
    const width_proportion = '80%';
    const height_proportion = '40%';
    
    const styles = StyleSheet.create({
      screen: {
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center',
        backgroundColor: '#5A9BD4',
      },
      box: {
        width: width_proportion,
        height: height_proportion,
        alignItems: 'center',
        justifyContent: 'center',
        backgroundColor: '#B8D2EC',
      },
      text: {
        fontSize: 18,
      },
    });
    
    export default () => (
      <View style={styles.screen}>
        <View style={styles.box}>
          <Text style={styles.text}>
            {width_proportion} of width{'\n'}
            {height_proportion} of height
          </Text>
        </View>
      </View>
    );
    

88

สิ่งนั้นควรตรงกับความต้องการของคุณ:

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>
        );
    }
});

17
เพียงแค่ <View style = {{width: '75% ', borderWidth: 1}}> </View>
user3044484

43

หากคุณต้องการให้อินพุตสัมพันธ์กับความกว้างของหน้าจอวิธีง่ายๆคือใช้ 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);

6
เอกสาร React Native ควรกล่าวถึงแพ็คเกจ Dimensions ในหน้าแรกซึ่งไม่ทำให้ฉันประหลาดใจ ...
AA Karim

คำตอบที่มีค่ามาก ขนาดมีประโยชน์มากจริงๆ หมายเหตุ: "แม้ว่ามิติข้อมูลจะพร้อมใช้งานในทันที แต่อาจมีการเปลี่ยนแปลง (เช่นเนื่องจากการหมุนของอุปกรณ์) ดังนั้นตรรกะหรือรูปแบบการแสดงผลใด ๆ ที่ขึ้นอยู่กับค่าคงที่เหล่านี้ควรพยายามเรียกใช้ฟังก์ชันนี้ในทุก ๆ การเรนเดอร์แทนที่จะแคชค่า (ตัวอย่างเช่นการใช้ สไตล์อินไลน์แทนที่จะกำหนดค่าใน StyleSheet) "
phil

โปรดทราบว่าการใช้ Dimensions จะทำให้เค้าโครงหลังการหมุนหน้าจอของคุณแตกหากคุณรองรับแนวนอนและไม่ได้จัดการกับการเปลี่ยนแปลงเค้าโครงเหล่านั้นด้วยตนเอง
ratsimihah

26

ใน StyleSheet ของคุณให้ใส่:

width: '80%';

แทน:

width: 80%;

ให้ Coding ........ :)


1
เราใช้flexBasis: 80%แทนได้ไหม? @krishna
SureshCS50

@ SureshCS50: ยังไม่ได้ลอง ฉันหวังว่าคุณจะทำได้ รายละเอียดเพิ่มเติมที่นี่: stackoverflow.com/questions/43143258/…
Krishna Raj Salim


5

เทคนิคที่ฉันใช้สำหรับการมีเปอร์เซ็นต์ความกว้างของพาเรนต์คือการเพิ่มมุมมองตัวเว้นวรรคพิเศษร่วมกับเฟล็กบ็อกซ์บางตัว สิ่งนี้จะใช้ไม่ได้กับทุกสถานการณ์ แต่จะมีประโยชน์มาก

ไปเลย:

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 "total" ของไอเท็มทั้งหมดใน flex container ดังนั้นหากรายการทั้งหมดรวมกันเป็น 100 คุณมีเปอร์เซ็นต์ ในตัวอย่างฉันสามารถใช้ค่า flex 6 & 4 สำหรับผลลัพธ์เดียวกันได้ดังนั้นจึง FLEXible มากขึ้น

หากคุณต้องการจัดกึ่งกลางมุมมองความกว้างเปอร์เซ็นต์: เพิ่มตัวเว้นวรรคสองตัวโดยมีความกว้างครึ่งหนึ่ง ในตัวอย่างมันจะเป็น 2-6-2

แน่นอนว่าการเพิ่มมุมมองพิเศษไม่ใช่สิ่งที่ดีที่สุดในโลก แต่ในแอปโลกแห่งความเป็นจริงฉันสามารถสร้างภาพตัวเว้นวรรคจะมีเนื้อหาที่แตกต่างกัน


คุณสามารถจินตนาการว่าตัวเว้นวรรคจะมีเนื้อหาที่แตกต่างกัน? ทำไม? ฉันนึกถึงตัวอย่างมากมายที่ตัวเว้นวรรคเป็นเพียง html ของฟิลเลอร์
AlxVallejo

1

ฉันมีโซลูชันที่อัปเดตแล้ว (ปลายปี 2019) เพื่อให้ได้ความกว้าง 80% ของผู้ปกครองตอบสนองด้วย Hooksมันใช้งานได้แม้ว่าอุปกรณ์จะหมุน

คุณสามารถใช้Dimensions.get('window').widthเพื่อรับความกว้างของอุปกรณ์ในตัวอย่างนี้คุณจะเห็นว่าคุณสามารถทำได้อย่างตอบสนอง

import React, { useEffect, useState } from 'react';
import { Dimensions , View , Text , StyleSheet  } from 'react-native';

export default const AwesomeProject() => {
   const [screenData, setScreenData] = useState(Dimensions.get('window').width);

    useEffect(() => {
     const onChange = () => {
     setScreenData(Dimensions.get('window').width);
     };
     Dimensions.addEventListener('change', onChange);

     return () => {Dimensions.removeEventListener('change', onChange);};
    });

   return (  
          <View style={[styles.container, { width: screenData * 0.8 }]}>
             <Text> I'mAwesome </Text>
           </View>
    );
}

const styles = StyleSheet.create({
container: {
     flex: 1,
     alignItems: 'center',
     justifyContent: 'center',
     backgroundColor: '#eee',
     },
});

1

วิธีที่ง่ายที่สุดในการบรรลุคือการใช้ความกว้างในการดู

width: '80%'

0

นี่คือวิธีที่ฉันมีทางออก เรียบง่ายและน่ารัก ไม่ขึ้นกับความหนาแน่นของหน้าจอ:

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>
    );
  }
}

0

เพียงแค่ใส่เครื่องหมายคำพูดตามขนาดในโค้ดของคุณ การใช้สิ่งนี้คุณสามารถใช้เปอร์เซ็นต์ความกว้างความสูง

input: {
    width: '80%'
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.