Phản ứng văn bản gốc đi ra khỏi màn hình của tôi, từ chối bọc. Phải làm sao


121

Các mã sau đây có thể được tìm thấy trong ví dụ trực tiếp này

Tôi đã có các yếu tố bản địa phản ứng sau:

'use strict';

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

var SampleApp = React.createClass({
  render: function() {
    return      (
  <View style={styles.container}>

        <View style={styles.descriptionContainerVer}>
          <View style={styles.descriptionContainerHor}>
            <Text style={styles.descriptionText} numberOfLines={5} >
              Here is a really long text that you can do nothing about, its gonna be long wether you like it or not, so be prepared for it to go off screen. Right? Right..!
            </Text>
          </View>
        </View>

        <View style={styles.descriptionContainerVer2}>
          <View style={styles.descriptionContainerHor}>
            <Text style={styles.descriptionText} numberOfLines={5} >Some other long text which you can still do nothing about.. Off the screen we go then.</Text>
          </View>
        </View>



  </View>);
  }
});
AppRegistry.registerComponent('SampleApp', () => SampleApp);

với các phong cách sau:

var styles = StyleSheet.create({
  container:{
        flex:1,
    flexDirection:'column',
        justifyContent: 'flex-start',
        backgroundColor: 'grey'
    },
    descriptionContainerVer:{
    flex:0.5, //height (according to its parent)
    flexDirection: 'column', //its children will be in a row
    alignItems: 'center',
    backgroundColor: 'blue',
    // alignSelf: 'center',
  },
  descriptionContainerVer2:{
    flex:0.5, //height (according to its parent)
    flexDirection: 'column', //its children will be in a row
    alignItems: 'center',
    backgroundColor: 'orange',
    // alignSelf: 'center',
  },
  descriptionContainerHor:{
    //width: 200, //I DON\'T want this line here, because I need to support many screen sizes
    flex: 0.3,  //width (according to its parent)
    flexDirection: 'column',    //its children will be in a column
    alignItems: 'center', //align items according to this parent (like setting self align on each item)
    justifyContent: 'center',
    flexWrap: 'wrap'
  },
  descriptionText: {
    backgroundColor: 'green',//Colors.transparentColor,
    fontSize: 16,
    color: 'white',
    textAlign: 'center',
    flexWrap: 'wrap'
  }
});

Kết quả này trong màn hình sau:

Ứng dụng tắt văn bản

Làm cách nào tôi có thể ngăn văn bản tắt khỏi màn hình và giữ nó ở giữa màn hình với chiều rộng tức là 80% của phụ huynh.

Tôi không nghĩ mình nên sử dụng widthvì tôi sẽ chạy nó trên NHIỀU màn hình di động khác nhau và tôi muốn nó phải năng động, vì vậy tôi nghĩ rằng tôi nên hoàn toàn dựa vào flexbox.

(Đó là lý do ban đầu tại sao tôi có flex: 0.8trong descriptionContainerHor.

Những gì tôi muốn đạt được là một cái gì đó như thế này:

Những gì tôi muốn đạt được

Cảm ơn bạn!

Câu trả lời:


203

Tôi tìm thấy giải pháp từ liên kết dưới đây.

[Văn bản] Văn bản không bao bọc # 1438

<View style={{flexDirection:'row'}}> 
   <Text style={{flex: 1, flexWrap: 'wrap'}}> You miss fdddddd dddddddd 
     You miss fdd
   </Text>
</View>

Đầu ra

Dưới đây là liên kết người dùng hồ sơ Github nếu bạn muốn cảm ơn anh ấy.

Đồng minh gợn


Chỉnh sửa: Thứ ba ngày 09 tháng 4 năm 2019

Như @sudoPlz đã đề cập trong các bình luận, nó hoạt động với việc flexShrink: 1cập nhật câu trả lời này.

nhập mô tả hình ảnh ở đây


1
Cảm ơn, đó là một câu trả lời tuyệt vời, nhưng tôi đã thử nó và vì một số lý do, nó không luôn luôn hoạt động (không biết tại sao: S). flexWrap là một chút không ổn định trong phản ứng tự nhiên. +1 mặc dù đã đưa nó lên.
SudoPlz

1
^ ^ Đây là câu trả lời thực tế ở đây. Chấp nhận Op này!
Greg Blass

1
Chỉ cần lưu ý phần thông tin của câu trả lời này github.com/facebook/react-native/issues/iêu
SudoPlz

11
Tôi phát hiện ra rằng trong một số trường hợp flexShrink: 1áp dụng cho chế độ xem cha mẹ cũng sẽ giúp ích.
SudoPlz

Những công việc này. Cảm ơn.
Uddesh_jain

67

Đây là một lỗi đã biết . flexWrap: 'wrap'không làm việc cho tôi nhưng giải pháp này dường như hiệu quả với hầu hết mọi người

<View style={styles.container}>
    <Text>Some text</Text>
</View>

Kiểu dáng

export default StyleSheet.create({
    container: {
        width: 0,
        flexGrow: 1,
        flex: 1,
    }
});

1
chỉ cần tôi một ngày để tìm thấy câu trả lời của bạn ... Cảm ơn!
Kevin Amiranoff

62

Giải pháp cho vấn đề đó là flexShrink: 1.

<View
    style={{ flexDirection: 'row' }}
> 
   <Text style={{ flexShrink: 1 }}>
       Really really long text...
   </Text>
</View>

Tùy thuộc vào thiết lập của bạn, bạn cũng có thể cần phải thêm flexShrink: 1vào <View>cha mẹ của chúng, để làm cho nó hoạt động, vì vậy hãy chơi với nó và bạn sẽ làm cho nó.

Giải pháp được phát hiện bởi Adam Pietrasiak trong chủ đề này.


Quan điểm của phụ huynh cũng là giải pháp cho tôi! Nếu cha mẹ có flexDirection: 'cột', văn bản từ chối bọc.
crestinglight

1
Bạn vừa cứu mạng tôi
Nikandr Marhal

Làm việc hoàn hảo, Cảm ơn bạn!
fadzb

31

bạn chỉ cần có một trình bao bọc cho bạn <Text>với flex như dưới đây;

<View style={{ flex: 1 }}>
  <Text>Your Text</Text>
</View>

2
Đó là giải pháp thích hợp duy nhất thực sự hoạt động tốt
Luôn luôn được sử dụng vào

2
Thật vậy, flex: 1là tất cả những gì bạn cần.
ví dụ

9

Nó hoạt động nếu bạn loại bỏ flexDirection: rowtừ descriptionContainerVerdescriptionContainerVer2tương ứng.

CẬP NHẬT (xem bình luận)

Tôi đã thực hiện một vài thay đổi để đạt được những gì tôi nghĩ là sau đó. Trước hết tôi loại bỏ descriptionContainerHorthành phần. Sau đó, tôi đặt flexDirectionchế độ xem dọc thành rowvà thêm alignItems: 'center'justifyContent: 'center'. Vì các khung nhìn dọc hiện đang được xếp chồng lên nhau theo trục ngang, tôi đã loại bỏ Verphần đó khỏi tên.

Vì vậy, bây giờ bạn có chế độ xem trình bao bọc theo chiều dọc và chiều ngang, căn chỉnh nội dung của nó và xếp nó dọc theo trục x. Sau đó tôi chỉ cần đặt hai Viewthành phần vô hình ở bên trái và bên phải của Textthành phần để thực hiện phần đệm.

Như thế này:

<View style={styles.descriptionContainer}>
  <View style={styles.padding}/>
    <Text style={styles.descriptionText} numberOfLines={5} >
      Here is a really long text that you can do nothing about, its gonna be long wether you like it or not, so be prepared for it to go off screen. Right? Right..!
    </Text>
  <View style={styles.padding}/>
</View>

Và điều này:

descriptionContainer:{
  flex:0.5, //height (according to its parent),
  flexDirection: 'row',
  backgroundColor: 'blue',
  alignItems: 'center',
  justifyContent: 'center',
  // alignSelf: 'center',
},
padding: {
  flex: 0.1
},
descriptionText: {
  backgroundColor: 'green',//Colors.transparentColor,
  fontSize: 16,
  flex: 0.8,
  color: 'white',
  textAlign: 'center',
  flexWrap: 'wrap'
},

Sau đó, bạn nhận được những gì tôi tin rằng bạn là sau.

CẢI TIẾN

Bây giờ nếu bạn muốn xếp chồng nhiều vùng văn bản trong chế độ xem màu xanh và màu cam, bạn có thể làm một cái gì đó như thế này:

<View style={styles.descriptionContainer2}>
  <View style={styles.padding}/>
  <View style={styles.textWrap}>
    <Text style={styles.descriptionText} numberOfLines={5} >
      Some other long text which you can still do nothing about.. Off the screen we go then.
    </Text>
    <Text style={styles.descriptionText} numberOfLines={5} >
      Another column of text.
    </Text>
  </View>
  <View style={styles.padding}/>
</View>

Trường hợp textWrapđược tạo kiểu như thế này:

textWrap: {
  flexDirection: 'column',
  flex: 0.8
},

Hi vọng điêu nay co ich!


Ok tôi đã thay đổi câu hỏi một chút để phản ánh những gì tôi thực sự muốn đạt được. Bây giờ về câu trả lời: Lý do tôi sử dụng flexDirection: rowlà vì (nếu tôi có quyền này trong đầu) flexDirectionchỉ ra hướng 'con cái' của cha mẹ đó sẽ được xếp chồng lên nhau. Bây giờ tôi muốn văn bản trở thành con giữa trong một bậc cha mẹ sắp xếp con cái liên tiếp và chiếm 80% chiều rộng của cha mẹ (giống như bức ảnh thứ hai). Bạn có thể vui lòng cập nhật câu trả lời một chút để phản ánh điều đó? Tôi sẵn sàng chấp nhận điều này như câu trả lời.
SudoPlz 30/03/2016

Xin lỗi vì trả lời muộn, đã bận. Nhưng tôi đã cập nhật câu trả lời của mình, hy vọng đây là những gì bạn cần.
Eysi

Câu trả lời này thật TUYỆT VỜI .. Chính xác là những gì tôi đang tìm kiếm, cảm ơn Elliot !!!!!
SudoPlz

flexDirection: "row"là cốt lõi của vấn đề của tôi, đã thử mọi thứ khác mà không gặp may mắn. Thay đổi của bạn flexDirectionđể columnvà các văn bản bên trong nó sẽ quấn bình thường.
tám mươi

8

Một giải pháp khác mà tôi tìm thấy cho vấn đề này là bằng cách gói Văn bản bên trong Chế độ xem. Đồng thời đặt kiểu của Chế độ xem thành flex: 1.


2

Tôi muốn thêm rằng tôi đã có cùng một vấn đề và flexWrap, flex: 1 (trong các thành phần văn bản), không có gì flex hoạt động với tôi.

Cuối cùng, tôi đặt chiều rộng của trình bao bọc thành phần văn bản của mình thành chiều rộng của thiết bị và văn bản bắt đầu gói. const win = Dimensions.get('window');

      <View style={{
        flex: 1,
        flexDirection: 'column',
        justifyContent: 'center',
        alignSelf: 'center',
        width: win.width
      }}>
        <Text style={{ top: 0, alignSelf: 'center' }} >{image.title}</Text>
        <Text style={{ alignSelf: 'center' }}>{image.description}</Text>
      </View>

1
<View style={{flexDirection:'row'}}> 
   <Text style={{ flex: number }}> You miss fdddddd dddddddd 
     You miss fdd
   </Text>
</View>

{flex: aNumber} là tất cả những gì bạn cần!

Chỉ cần đặt 'flex' thành một số phù hợp với bạn. Và sau đó văn bản sẽ bọc.


Thật kỳ lạ, đây thực sự là bản sửa lỗi phù hợp với tôi.
Dror Bar

1

Trong phiên bản 0.62.2 của React Native, tôi chỉ đặt "flex-co: 1" trong Container của "Văn bản" của mình, nhưng hãy nhớ hướng flex: row trong View of container. Cảm ơn các bạn đã giúp đỡ.

Mã của tôi:

export const Product = styled.View`
  background: #fff;
  padding: 15px 10px;
  border-radius: 5px;
  margin: 5px;
  flex-direction: row;
`;

export const ProductTitleContainer = styled.View`
  font-size: 16px;
  margin-left: 5px;
  flex-shrink: 1;
`;

export const ProductTitle = styled.Text`
  font-size: 16px;
  flex-wrap: wrap;
`;
`;

-1

giải pháp của tôi dưới đây:

<View style={style.aboutContent}>
     <Text style={[styles.text,{textAlign:'justify'}]}>
        // text here                            
     </Text>
</View>

Phong cách:

aboutContent:{
    flex:8,
    width:widthDevice-40,
    alignItems:'center'
},
text:{
    fontSize:widthDevice*0.04,
    color:'#fff',
    fontFamily:'SairaSemiCondensed-Medium'
},

kết quả: [d] kết quả của tôi [1]


Vì vậy, bạn đang sử dụng chiều rộng tĩnh trên cha mẹ, đó chính xác là những gì chúng tôi muốn tránh ở đây.
SudoPlz

-2
<Text style={{width: 200}} numberOfLines={1} ellipsizeMode="tail">Your text here</Text>

Vui lòng mô tả phần nào trong câu trả lời của bạn giải quyết các vấn đề của OP và tại sao.
Sebastian B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.