2015-07-13 20 views
9

Tôi chỉ đang học React Native và tôi muốn tạo một chuỗi các nút sử dụng dữ liệu động. mã hiện tại của tôi là:Phản hồi các tham số truyền gốc thông qua chức năng bản đồ

var locations = this.state.campus.map(function(item, key){ 
      return(
       <TouchableHighlight key={key} 
       style={[styles.button, (this.state.location==={item} && styles.buttonPressed)]} 
       underlayColor='#dddddd' 
       onPress={()=>this.buttonPress({item})} > 
       <Text style={ 
        styles.plainText}>{item}</Text> 
      </TouchableHighlight> 
      ) 

Vấn đề của tôi là với các dòng

style={[styles.button, (this.state.location==={item} && styles.buttonPressed)]} 

onPress={()=>this.buttonPress({item})} 

tôi đang cố gắng tạo ra những dòng này bằng cách sử dụng dữ liệu tự động tắt chức năng bản đồ. Những dòng mã hoạt động hoàn hảo nếu tôi sử dụng dữ liệu tĩnh (tức là tạo ra mỗi nút riêng biệt), nhưng không sử dụng dữ liệu động. Mã này tạo ra một màn hình hiển thị để vấn đề không phải là với kết xuất, vấn đề là với chức năng.

Khi nhấn nút Tôi nhận được thông báo lỗi không xác định trong không phải là đối tượng trong khi kiểu chỉ đơn giản là làm cho toàn bộ màn hình không hiển thị.

Rõ ràng là dữ liệu động ({item}) hoạt động bên trong phần tử Văn bản nhưng không được chuyển đến hai phần tử khác dưới dạng dữ liệu. Tôi đã thử sử dụng {{item}} nhưng điều này gây ra lỗi cú pháp.

Có cách nào để xử lý dữ liệu động như thế này trong React Native không?

+0

Đối với một người nào đó trong tương lai ... giải pháp được cung cấp tại đây có thể giúp: http://stackoverflow.com/questions/35663375/how-to-pass-a-component-reference-to-onpress-callback –

+0

vấn đề đã xảy ra vì bạn đang sử dụng hàm usin (mục, khóa) {và bạn phải sử dụng chức năng mũi tên var locations = this.state.campus.map ((mục, khóa) => {return miukki

Trả lời

9

Trong cả hai trường hợp, bạn không cần thiết phải gói item vào {}. Đối với cả hai dòng này, các biểu thức bên trong {} bên ngoài là javascript thuần túy (một mảng và một hàm) và phải theo cú pháp javascript.

Vì vậy, các dòng nên đọc như sau:

style={[styles.button, (this.state.location===item && styles.buttonPressed)]} 

onPress={()=>this.buttonPress(item)} 
+0

Bạn có thể đúng, tuy nhiên điều này không giải quyết được vấn đề, nó chỉ tạo ra nhiều lỗi hơn. Bây giờ tôi nghĩ rằng toàn bộ thiết kế của tôi là sai nên tôi sẽ quay lại bảng vẽ và tìm ra cách để làm điều này theo một cách khác. Tôi nghĩ rằng tôi cần phải tạo ra các nút này trong một ListView. – nwilliams36

+0

Bạn nên [luôn tránh sử dụng các hàm 'bind' hoặc mũi tên bên trong JSX/bên trong hàm' render'] (https://stackoverflow.com/questions/36677733/why-shouldnt-jsx-props-use-arrow-functions -hoặc ràng buộc) bởi vì chúng tạo ra một hàm mới mỗi lần làm cho mọi mục trong danh sách/mảng/bản đồ được trả lại khi một đơn lẻ được nhấn trừ khi bạn cũng cung cấp hàm so sánh tùy chỉnh trong 'shouldComponentUpdate' bỏ qua so sánh trường 'buttonPress'. – hippietrail

1

Bạn nên lưu trữ này trong một biến khác: hãy _this = này;

Sau đó sử dụng _this thay vì điều này

+0

Chào mừng bạn đến với Stack Overflow! Đây thực sự là một bình luận, không phải là một câu trả lời. Với đại diện nhiều hơn một chút, [bạn sẽ có thể đăng nhận xét] (// stackoverflow.com/privileges/comment). – manetsus

+0

Bạn có thể cung cấp ví dụ về nơi tạo biến này không? –

0

vấn đề được xảy ra bởi vì bạn đang sử dụng chức năng (item, key) {và bạn phải sử dụng mũi tên chức năng

let locations = this.state.campus.map((item, key) => { return <TouchableHighlight key={key}.. 

bạn phải làm điều đó cho giữ sử dụng 'này' bối cảnh

-1

phương pháp này là công việc: 1) Tạo chức năng để tạo yếu tố với dữ liệu ngay động

createElement = (item) => { 
    return(
     <TouchableHighlight onPress={()=>this.buttonPress({item})}> 
      <Text style={ styles.plainText }> {item} </Text> 
     </TouchableHighlight> 
    ) 
}; 

2) Sử dụng chức năng này vào làm chức năng như thế nào trong tiếp theo Ví dụ:

render (
    elementsList = []; 
    for (var i = 0; i < 10; i++){ 
     elementsList.push(this.createElement(i)); 
    }; 

    return (
     <View> 
      {elementsList} 
     </View> 
    ) 
); 

Nó làm việc, nếu bạn hiểu cách sử dụng này.

+0

https://stackoverflow.com/questions/36677733/why-shouldnt-jsx-props-use-arrow-functions-or-bind – hippietrail

Các vấn đề liên quan