更改列表中“切换”元素的样式,本地反应
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改列表中“切换”元素的样式,本地反应相关的知识,希望对你有一定的参考价值。
我在更改列表中只有一个元素的样式时遇到了麻烦。下面是我的Main
类,以及StationDetails
类,它是我创建的用于逐个呈现列表元素的组件。
在qazxsw poi中有一条线(第31行)我似乎无法弄清楚问题。我想根据元素的ID是否包含在qazxsw poi列表中来设置组件的样式。
这是一行:
StationDetails
这是我的activeStations
课程
style={activeStations.includes(stations.id) ? pressedStyle : buttonStyle}
这是我的Main
组件。
import React, { Component } from "react"
import axios from "axios"
import { Text, View, ScrollView } from "react-native"
import StationDetails from "./StationDetails"
class Main extends Component {
constructor(props) {
super(props)
this.state = { stations: [], pressStatus: false, activeStations: [] }
this.handleClick = this.handleClick.bind(this)
}
componentWillMount() {
axios
.get("https://api.citybik.es/v2/networks/trondheim-bysykkel")
.then(response =>
this.setState({ stations: response.data.network.stations })
)
}
handleClick() {
this.setState({ pressStatus: !this.state.pressStatus })
}
renderStations() {
return this.state.stations.map(stations => (
<StationDetails
activeStations={this.state.activeStations}
handleClick={this.handleClick}
pressStatus={this.state.pressStatus}
key={stations.id}
stations={stations}
>
{stations.name}
</StationDetails>
))
}
render() {
return (
<ScrollView style={{ flex: 1, marginTop: 20 }}>
{this.renderStations()}
</ScrollView>
)
}
}
export default Main
你试图从StationDetails
设置import React from "react"
import { Text, View } from "react-native"
import Card from "./felles/Card"
import CardSection from "./felles/CardSection"
import Button from "./felles/Button"
const StationDetails = ({
stations,
handleClick,
pressStatus,
activeStations
}) => {
const {
headerTextStyle,
leftPartStyle,
rightPartStyle,
pressedStyle,
buttonStyle
} = styles
return (
<Card style={{ flex: 1, flexDirection: "row" }}>
<CardSection style={leftPartStyle}>
<Text style={headerTextStyle}>
{stations.name}
</Text>
<Text>
Free bikes: {stations.free_bikes}
</Text>
</CardSection>
<CardSection style={rightPartStyle}>
<Button
onPress={() => {
if (!activeStations.includes(stations.id)) {
activeStations.push(stations.id)
} else {
activeStations.splice(activeStations.indexOf(stations.id), 1)
}
}}
style={
activeStations.includes(stations.id) ? pressedStyle : buttonStyle
}
>
Abonner
</Button>
</CardSection>
</Card>
)
}
const styles = {
textStyle: {
fontSize: 14
},
leftPartStyle: {
flex: 3,
flexDirection: "column",
justifyContent: "space-between"
},
rightPartStyle: {
flex: 1
},
pressedStyle: {
backgroundColor: "green"
},
headerTextStyle: {
fontSize: 18
},
thumbnailStyle: {
height: 50,
width: 50
},
buttonStyle: {
backgroundColor: "#fff"
}
}
export default StationDetails
的状态,这是不可取的。很少有事情要记住
- 主要的
Main.activeStations
处于本地组件级别状态。 - 你不应该试图从子组件中改变它。
- 由于您从
StationDetails
将变异的qazxsw poi状态分配给qazxsw poi,因此React Native(RN)在其对帐过程中找不到状态差异,因此不会重新渲染activeStations
。 - 我们需要RN重新渲染
activeStations
,以便它显示按钮等的正确样式。 - 有关
Main.activeStations
的文档
我就是这样做的
- 让
StationDetails
渲染StationDetails
- 从
StationDetails
获取一个回调选择的回调 - 让setState负责改变它自己的内部状态(
Main
)
通过这样做,
StationDetails
只负责渲染道具列表,而不是其他任何东西。这是一个愚蠢的组件,呈现一个列表。StationDetails
负责处理它自己的内部状态
下面是结果:
Main
类
activeStations
StationDetails
类
Main
以上是关于更改列表中“切换”元素的样式,本地反应的主要内容,如果未能解决你的问题,请参考以下文章