我有
<ScrollView horizontal={true} >
{this.state.images.map((uri,i) =>
<Thumb key={i} number={i} uri={uri} onDelete ={this.deleteImage.bind(this)} /> )}
</ScrollView>
此处每个Thumb
班级都有Image
。每当我点击图片时,都需要从ScrollView
删除。
我的Thumb组件看起来像这样
class Thumb extends React.Component {
constructor(props){
super(props);
this.state = {
show : false
}
}
shouldComponentUpdate(nextProps, nextState) {
console.log(nextProps,'nextprops')
return false;
}
render() {
return (
<View style={[styles.button ]}>
<View style={[{position:'relative'},styles.img]} >
<View style={{position:'absolute'}}>
<Image style={styles.img} source={{uri:this.props.uri.path}}/>
</View>
<View style={[styles.img , {position:'absolute',alignItems:'center',justifyContent:'center',opacity:1}]}>
<TouchableHighlight onPress = {() => {this.props.onDelete(this.props))}}>
<Icon name="close" size = {30} color="white"/>
</TouchableHighlight>
</View>
</View>
</View>
);
}
}
我试图删除
deleteImage(deleteProp){
// console.log(_scrollView)
// _scrollView.props.children.splice(deleteProp.number,1)
// console.log(_scrollView)
console.log(deleteProp,'prop from delete method');
console.log(this.state.images ,'before')
let images = this.state.images;
console.log(images.splice(deleteProp.number ,1),'splice data');
this.setState({images : images});
console.log(this.state.images,'after')
if(this.state.images.length == 0 ){
this.setState({loading:false})
}
}
我该如何实现这个目标?
我尝试删除相应的状态明智的Image对象,但它总是删除ScrollView(或最后一个Thumb组件)的最后一个图像。
我是新的反应原生和Android我不知道ScrollView可以做到这一点。请建议我正确的方法。
答案 0 :(得分:1)
这是一个非常常见的问题,会让组件中的角色keys
混乱。我们将密钥视为动态生成组件的唯一标识符。但它也可以作为React知道哪些组件需要重新绘制的手段。
因此,我建议将key
更改为图像本身的独特内容,而不是位置。
<Thumb key={uri.path} number={i} uri={uri} onDelete={this.deleteImage.bind(this)} />
Here's the official docs on keys
关键只需要在其兄弟姐妹中独一无二,而不是全球唯一。作为最后的手段,您可以将数组中的项目索引作为键传递。 如果项目从不重新排序,这可以很好地工作,但重新排序会很慢。 (强调我的)。
This is another good article about why keys are important
此外,当你有阵列生成组件时,我喜欢&#34; preload&#34;不需要索引,id等的函数传递给它。
// original component
<Thumb key={i} number={i} uri={uri} onDelete={this.deleteImage.bind(this)} />
// updated function by adding index to bind params and unique key
<Thumb key={uri.path} number={i} uri={uri} onDelete={this.deleteImage.bind(this,i)} />
这样,当您想要删除时,您只需拨打this.props.onDelete()
即可。只是偏好,但我认为它更清洁。
答案 1 :(得分:0)
<强>拇指强>:
class Thumb extends React.Component {
constructor(props){
super(props);
this.state = {
show : false
}
}
shouldComponentUpdate(nextProps, nextState) {
console.log(nextProps,'nextprops')
return false;
}
render() {
return (
<View style={[styles.button ]}>
<View style={[{position:'relative'},styles.img]} >
<View style={{position:'absolute'}}>
<Image style={styles.img} source={{uri:this.props.uri.path}}/>
</View>
<View style={[styles.img , {position:'absolute',alignItems:'center',justifyContent:'center',opacity:1}]}>
<TouchableHighlight onPress = {this.props.onDelete}>
<Icon name="close" size = {30} color="white"/>
</TouchableHighlight>
</View>
</View>
</View>
);
}
}
<强>滚动型强>
<ScrollView horizontal={true} >
{this.state.images.map((uri,index) =>
<Thumb key={index} uri={uri} onDelete={this.deleteImage.bind(this, index)}/> )}
</ScrollView>
<强>删除图像()强>
deleteImage(index) {
const images = this.state.images;
const newImages = [...images.slice(0, index), ...images.slice(index + 1, images.length)];
let newState = { images: newImages };
if(images.length === 0){
newState = { ...newState, loading: false };
}
this.setState(newState);
}