javascript - React Native - 动态状态?或等效的解决方案
问题描述
我正在尝试构建一个显示警报代码的视图 - 这些代码以数据数组的形式传递给应用程序,如下所示:
alarm:[{ location: "Main Door", code:"123456"}, { location: "Back Door", code:"456789"}],
对于每个实例,可能有 1 个或多个代码。
我正在通过此地图功能显示代码:
return this.state.alarmsOnSite.map((data, index) => {
return (
<View key={index}>
<Text style={GlobalStyles.SubHeading}>
Alarm: {data.location}
</Text>
<View style={[GlobalStyles.GreyBox, {position:'relative'}]}>
<Text style={GlobalStyles.starText}>
********
</Text>
<TouchableOpacity
style={CheckInStyles.eyeballImagePlacement}
>
<View style={CheckInStyles.eyeballImage} >
<Image
style={CheckInStyles.eyeballImageImage}
source={require('../images/icons/ico-eyeball.png')}
/>
</View>
</TouchableOpacity>
</View>
</View>
)
});
简报指出,按下可触摸的不透明度 - 星星应切换为仅显示 5 秒钟的代码。我在想这对状态来说很容易——我可以在两个 Text 对象上切换一个显示类来隐藏/显示星星或代码。但是如果我不知道会有多少警报代码,我该如何在固定状态下做到这一点?我可以使用动态状态吗?
解决方案
设置您的状态时,在对象中包含一个属性,以确定它们是否正在显示:
this.state = {
alarmsOnSite: whereverYoureGettingTheDataNow.map(obj => ({...obj, showing: false})),
// ...
};
然后响应触摸,将该标志设置为true
,然后false
在五秒钟后返回。例如,如果触摸是在ToucableOpacity
自身上(对不起,我不知道那个组件):
<View style={[GlobalStyles.GreyBox, {position:'relative'}]}>
<Text style={GlobalStyles.starText}>
{data.showing ? data.code : "********"}
</Text>
<TouchableOpacity
style={CheckInStyles.eyeballImagePlacement}
onTouch={() => this.showAlarm(data)}
>
<View style={CheckInStyles.eyeballImage} >
<Image
style={CheckInStyles.eyeballImageImage}
source={require('../images/icons/ico-eyeball.png')}
/>
</View>
</TouchableOpacity>
</View>
...在哪里showAlarm
:
showAlarm(alarm) {
let updated = null;
this.setState(
({alarmsOnSite}) => ({
alarmsOnSite: alarmsOnSite.map(a => {
if (a === alarm) {
return updated = {...a, showing: true};
}
return a;
})
}),
() => {
setTimeout(() => {
this.setState(({alarmsOnSite}) => ({
alarmsOnSite: alarmsOnSite.map(a => a === updated ? {...a, showing: false} : a)
}));
}, 5000);
}
);
}
...或类似的。
这是一个简化的示例:
const whereverYoureGettingTheDataNow = [{ location: "Main Door", code:"123456"}, { location: "Back Door", code:"456789"}];
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
alarmsOnSite: whereverYoureGettingTheDataNow.map(obj => ({...obj, showing: false})),
// ...
};
}
showAlarm(alarm) {
let updated = null;
this.setState(
({alarmsOnSite}) => ({
alarmsOnSite: alarmsOnSite.map(a => {
if (a === alarm) {
return updated = {...a, showing: true};
}
return a;
})
}),
() => {
setTimeout(() => {
this.setState(({alarmsOnSite}) => ({
alarmsOnSite: alarmsOnSite.map(a => a === updated ? {...a, showing: false} : a)
}));
}, 5000);
}
);
}
render() {
return <div>
{this.state.alarmsOnSite.map((data, index) => (
<div key={index}>
{data.location}
<div onClick={() => this.showAlarm(data)}>
{data.showing ? data.code : "********"}
</div>
</div>
))}
</div>;
}
}
ReactDOM.render(<Example/>, document.getElementById("root"));
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.development.js"></script>
推荐阅读
- c++ - 算术表达式可以作为参数传递给函数来描述其中的逻辑吗?
- c++ - Nodejs:如何从 C++ 程序启动节点应用程序
- report - 有没有办法在 vhdl 中的模拟开始时只打印一次断言?
- java - How to advise static methods using Spring AOP?
- c# - Print name of browser in nunit testresult xml
- selenium-webdriver - Selenium combination keys (Ctrl+99)
- python - 将数据帧拆分为多个,具有重叠行
- angular - Unit test Angular with stubbing a variable
- django - 在基于函数的视图中获取 URL 参数
- jquery - 如何在shopify首发主题中将缩略图添加到默认滑块中?