Я пытаюсь изучить React-Native. Я смотрю на an example, Responsive image grid by Joshua Sierles. (Спасибо, Джошуа!). В этом примере Джошуа использует React для тщательного размещения элементов изображения контролируемым образом на мобильном дисплее. Примечание: он использует ТОЛЬКО три изображения и повторяет их несколько раз в документе. К сожалению, как написано, пример генерирует предупреждение:Каков правильный способ идентификации свойств ключа React?
Предупреждение: Каждый ребенок в массиве или итератора должен иметь уникальный «ключ» опору. Проверьте метод рендеринга
YourProjectNameHere
. См. fb.me/react-warning-keys для получения дополнительной информации. (Ссылка экстраполированы из укороченной формы ...)
Я полностью понимаю, что каждый элемент в строке, и каждая строка генерируется Реагировать must have a unique key property. То, что я не ясно, как именно это сделать. Вот мой хак/работа вокруг. key={Math.random()}
Этот хак отлично работает, но это просто кажется ... неправильным. Вопрос в том, как правильно идентифицировать идентификаторы отдельных изображений, а также идентифицировать отдельные идентификаторы строк?
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
Image,
Dimensions,
ScrollView
} = React;
var _ = require('lodash');
var {width, height} = Dimensions.get('window');
var IMAGE_URLS = _.flatten(_.times(9,() => {return ['http://rnplay.org/IMG_0599.jpg', 'http://rnplay.org/IMG_0602.jpg', 'http://rnplay.org/IMG_0620.jpg']})); // 9 x 3 = 27 images
var IMAGES_PER_ROW = 4;
var AwesomeProject1 = React.createClass({
getInitialState() {
return {
currentScreenWidth: width,
currentScreenHeight: height
}
},
handleRotation(event) {
var layout = event.nativeEvent.layout
this.setState({currentScreenWidth: layout.width, currentScreenHeight: layout.height })
},
calculatedSize() {
var size = this.state.currentScreenWidth/IMAGES_PER_ROW
return {width: size, height: size}
},
// note: I added key={Math.random()} in two places below.
// Its a BS fix, but it seems to work to avoid the warning message.
renderRow(images) {
return images.map((uri) => {
return (
<Image style={[styles.image, this.calculatedSize()]} key={Math.random()} source={{uri: uri}} /> //key={Math.random()}
)
})
},
renderImagesInGroupsOf(count) {
return _.chunk(IMAGE_URLS, IMAGES_PER_ROW).map((imagesForRow) => {
return (
<View style={styles.row} key={Math.random()}>
{this.renderRow(imagesForRow)}
</View>
)
})
},
render: function() {
return (
<ScrollView onLayout={this.handleRotation} contentContainerStyle={styles.scrollView}>
{this.renderImagesInGroupsOf(IMAGES_PER_ROW)}
</ScrollView>
);
}
});
var styles = StyleSheet.create({
row: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start'
},
image: {
}
});
AppRegistry.registerComponent('AwesomeProject1',() => AwesomeProject1);
Я пробовал все комбинации key=uri.id , imagesForRow.id, images.id, etc
, что я могу думать. Ничего не работает так же хорошо, как функция Random Number. Другие идеи? Каков правильный способ сделать это?
Обновление для ответа Криса Гейрмана ниже: Я хотел показать свой последний код.
renderRow(images) {
return images.map((uri, idx) => {
return (
<Image style={[styles.image, this.calculatedSize()]} key={uri.concat(idx)} source={{uri: uri}} /> //key={Math.random()}
)
})
},
renderImagesInGroupsOf(count) {
return _.chunk(IMAGE_URLS, IMAGES_PER_ROW).map((imagesForRow, idx2) => {
return (
<View style={styles.row} key={imagesForRow.concat(idx2)}>
{this.renderRow(imagesForRow)}
</View>
)
})
},
правильный ответ, но я действительно хочу, чтобы узнать, как сделать это правильно в будущем (и понять, почему это правильно сделать. ..) – zipzit
Тогда имейте в виду, что A) другой ответ фактически не использует уникальный ключ для каждого компонента, он все еще использует индекс. Если эти компоненты были с точки зрения состояния или что-то еще, и вы изменили относительные позиции некоторых с тем же URI, это не сработало. Если в этом случае количество элементов и их положение внутри массива не изменятся в течение жизни страницы, то индекса будет достаточно. Если эти вещи будут меняться, и вам действительно нужно однозначно идентифицировать компоненты, тогда вам понадобятся действительно уникальные идентификаторы. __ \\ _ (ツ) _/¯ B) Не обращается к компонентам ''. –
JMM
Вы правы. Я действительно признаю, что это надуманный пример. В действительности, если вы когда-либо использовали этот дизайн в приложении, у вас были бы уникальные образы во всем мире, и вам нужно было «щелкнуть» их и сделать что-то. Вы, ребята, заставили меня лучше понять, почему Реакт нуждается в уникальном идентификаторе. Много thx. – zipzit