#react-native #react-native-android #react-native-ios
#react-native #react-native-ios
Вопрос:
У меня есть локальный файл json под названием Observer.json
{
"Observer": {
"Category_2":[{
"row1" : "Reading_1",
"row2" : "Reading_2",
"row3" : "Reading_3",
"row4" : "Reading_4"
}]
}
}
Я хочу отобразить эти данные, используя список разделов в react native. Там будет один раздел с заголовком Category_2 и 4 строками ie. Reading_1 и т.д. Пожалуйста, помогите, я не могу просмотреть какие-либо данные.
Вот код
import React, { Component } from 'react';
import { AppRegistry, View, Text,TouchableOpacity, ListView, StyleSheet,SectionList } from 'react-native';
import { createStackNavigator,createAppContainer } from "react-navigation";
const data_Custom = require('./Observer.json');
class RenderList extends Component {
static navigationOptions = {
title: 'List Items'
};
constructor() {
super();
var ds = new ListView.DataSource({
rowHasChanged: (r1, r2) => r1 !== r2,
sectionHeaderHasChanged: (h1, h2) => h1 !== h2,
});
this.state = {
dataSource: ds.cloneWithRowsAndSections({dataBlob: data_Custom}, {sectionIdentities:["Category_2"]}, {rowIdentities:["row1","row2","row3","row4"]} ),
};
}
renderRow(custom){
return (
<View >
<Text style = { styles.container2 }>
{custom.rowIdentities}
</Text>
</View>
);
}
renderSectionHeader(custom_s) {
return (
<Text style = { styles.container2 }>
{custom_s.sectionIdentities}
</Text>
)
}
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow.bind(this)}
renderSectionHeader={this.renderSectionHeader}
/>
);
}
}
const App = createStackNavigator({
List: { screen: RenderList },
});
export default createAppContainer(App);
const styles = StyleSheet.create({
container1:{
flex: 1
},
container2:{
flex: 1,
justifyContent: 'center',
alignItems: 'center',
paddingHorizontal: 15,
fontSize: 18
},
item:{
padding: 15
},
text:{
fontSize: 18
},
separator:{
height: 2,
backgroundColor: 'rgba(0,0,0,0.5)'
}
});
Ответ №1:
Можете ли вы попробовать следующее?
Сначала измените json
файл следующим образом,
[
{
"title":"Observer",
"data":[
{"row" : "Reading_1"},
{"row" : "Reading_2"},
{"row" : "Reading_3"},
{"row" : "Reading_4"}
]
}
...
]
Затем используйте SectionList
вместо ListView
, потому что ListView
не рекомендуется.
import React, { Component } from 'react';
import { AppRegistry, View, Text,TouchableOpacity, StyleSheet,SectionList } from 'react-native';
import { createStackNavigator,createAppContainer } from "react-navigation";
const data_Custom = require('./Observer.json');
class RenderList extends Component {
static navigationOptions = {
title: 'List Items'
};
constructor() {
super();
this.state = {
dataSource: data_Custom,
};
}
renderRow(item){
return (
<View>
<Text style = { styles.container2 }>
{item.row}
</Text>
</View>
);
}
renderSectionHeader(title) {
return (
<Text style = { styles.container2 }>
{title}
</Text>
)
}
render() {
return (
<SectionList
renderItem={({item, index, section}) => this.renderRow(item)}
renderSectionHeader={({section: {title}}) => this.renderSectionHeader(title)}
sections={this.state.dataSource}
keyExtractor={(item, index) => item index}
/>
);
}
}
const App = createStackNavigator({
List: { screen: RenderList },
});
export default createAppContainer(App);
const styles = StyleSheet.create({
container1:{
flex: 1
},
container2:{
flex: 1,
justifyContent: 'center',
alignItems: 'center',
paddingHorizontal: 15,
fontSize: 18
},
item:{
padding: 15
},
text:{
fontSize: 18
},
separator:{
height: 2,
backgroundColor: 'rgba(0,0,0,0.5)'
}
});
Комментарии:
1. Привет .. спасибо за ответ, Джебин…. Но я все еще получаю ошибку — Инвариантное нарушение: ItemwithSeperator (…): из рендеринга ничего не было возвращено. Обычно это означает, что оператор return отсутствует . Или, чтобы ничего не отображать, верните null .
2. Привет, сейчас я только что обновил код, пожалуйста, используйте его. Обновлено в файле JSON и методе ‘renderRow’ и методе ‘render’.