第 19 天~
昨天做到了,新增项目的部分,
像这样:
当我们可以成功的展示新增的项目後,
我们希望可以按一下项目,就让他切换 完成 | 未完成
,
我们把焦点放到 FlatList
,
<FlatList
data={list}
renderItem={({ item, index, separators }) => {
const backgroundColorStyle =
index % 2 === 0 ? styles.itemEven : styles.itemOdd;
return (
<TouchableOpacity
style={[styles.item, backgroundColorStyle]}
onPress={this.changeItemStatus(item.id)}>
<View style={[styles.tickArea]}></View>
<Text style={[styles.itemText]}>{item.text}</Text>
</TouchableOpacity>
);
}}
keyExtractor={(item) => item.id}
/>
在 TouchableOpacity component
的 onPress
加入 changeItemStatus,
changeItemStatus = (id) => () => {
const { list } = this.state;
const index = list.findIndex((item) => item.id === id);
const nowItem = list[index];
const newStatus = nowItem.status === 'done' ? 'not done' : 'done';
list[index] = {
...nowItem,
status: newStatus,
};
this.setState(() => {
return {
list: [...list],
};
});
};
changeItemStatus 会先放入 item 的 id
,
最後返回一个 function
放入 onPress
等待触发,
主要在座的就是从 list 取出 item 资讯,
判断之後的 status 并做出改变,
最後在更新 list
结果会是:
嗯... 未啥画面不动,
...对了,还需要加入 style,
更新过後的 FlatList component
<FlatList
data={list}
renderItem={({ item, index, separators }) => {
const backgroundColorStyle =
index % 2 === 0 ? styles.itemEven : styles.itemOdd;
const isDone = item.status === 'done';
return (
<TouchableOpacity
style={[styles.item, backgroundColorStyle, isDone && styles.itemDone]}
onPress={this.changeItemStatus(item.id)}>
<View style={[styles.tickArea, isDone && styles.tick]}></View>
<Text style={[styles.itemText, isDone && styles.doneText]}>
{item.text}
</Text>
</TouchableOpacity>
);
}}
keyExtractor={(item) => item.id}
/>
结果如下:
这样我们完成了改变项目的状态
设定 state , 新增 filterKey
this.state = {
filterKey: '',
inputValue: '',
list: [],
};
在 FlatList component
根据 filterKey
filter list
<FlatList
data={list.filter((item) => item.text.includes(filterKey))}
renderItem={({ item, index, separators }) => {
const backgroundColorStyle =
index % 2 === 0 ? styles.itemEven : styles.itemOdd;
const isDone = item.status === 'done';
return (
<TouchableOpacity
style={[styles.item, backgroundColorStyle, isDone && styles.itemDone]}
onPress={this.changeItemStatus(item.id)}>
<View style={[styles.tickArea, isDone && styles.tick]}></View>
<Text style={[styles.itemText, isDone && styles.doneText]}>
{item.text}
</Text>
</TouchableOpacity>
);
}}
keyExtractor={(item) => item.id}
/>
在 Search
的按钮这里,加入 searchList
function,
<TouchableOpacity style={styles.button} onPress={this.searchList}>
<Text style={styles.buttonText}>Search</Text>
</TouchableOpacity>
searchList
根据 inputValue
更新 filterKey
searchList = () => {
this.setState((state) => {
return {
filterKey: state.inputValue,
};
});
};
结果为:
在 Complete All
的按钮这里,加入 handleCompleteAll
function,
<TouchableOpacity style={styles.button} onPress={this.handleCompleteAll}>
<Text style={styles.buttonText}>Complete All</Text>
</TouchableOpacity>
handleCompleteAll
会把所有的 list status
全部设定为 done
handleCompleteAll = () => {
this.setState((state) => {
return {
list: state.list.map((item) => {
return {
...item,
status: 'done',
};
}),
};
});
};
结果为:
至此,我们的逻辑全部跟画面连接上了
<<: Day 19: Recap Google Cloud Platform
缘由: app菜鸟开发者首先被分配到的就是画面布局的部分,想说拉拉元件,设定限制条件,不让画面跑版就...
Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...
铁人赛写到现在,其实主题中的内容还有很多可以实作的部分,但一方面是不确定时间到期後,铁人赛系列还能不...
身处後端开发一定会接触到写code去操作资料库的需求,所以今天主题来介绍一点实务应用,透过Gola...
有了前面 30 天的基础之後,开始学 React 吧~ React 打算写 开发环境 jsx cla...