在这里,我们将实现从文章中删除书签。 这种情况比保存书签更简单。 在这里,我们将定义一个称为removeBookMark的函数。 为此,我们需要使用以下代码片段中的代码:
removeBookMark = async post_id => {this .setState({ already_bookmark : false });const bookmark = await AsyncStorage.getItem( 'bookmark' ).then( token => {const res = JSON .parse(token);return res.filter( e => e !== post_id);});await AsyncStorage.setItem( 'bookmark' , JSON .stringify(bookmark));};
在这里,我们已将already_bookmark
的状态更改为false。 然后,我们使用AsyncStorage模块的getItem函数获得了书本 。 然后,我们解析对JSON的响应,并将其存储在res常量中。 然后使用过滤器HOC,我们从书签中删除帖子ID。 然后,再次使用setItem将剩余值保存在书签数组中。
渲染书签
在这里,我们将根据文章是否已添加书签来更改already_bookmark
状态的值。 这个already_bookmark
状态将处理在SinglePost
屏幕中显示已添加书签或未添加书签的模板。 为此,我们需要创建一个名为renderBookMark的新函数,如下面的代码片段所示:
renderBookMark = async post_id => {await AsyncStorage.getItem( 'bookmark' ).then( token => {const res = JSON .parse(token);let data = res.find( value => value === post_id);return data == null? this .setState({ already_bookmark : false }): this .setState({ already_bookmark : true });});};
在此,该函数将发布ID作为参数。 然后,通过使用帖子ID,我们使用AsyncStorage的getItem函数获得书签ID。 获得值之后,我们对其进行解析,然后检查书签数组中是否存在文章发布ID。 如果存在,我们将already_bookmark
状态设置为true,否则将其设置为false。
然后,我们需要在componentDidMount()上调用此函数,并将post id设置为我们从导航道具中获取的参数,如下面的代码片段所示:
componentDidMount() {this .fetchPost().then( () => {this .renderBookMark( this .props.navigation.getParam( 'post_id' ));});}
因此,我们将在仿真器屏幕中获得以下结果:
如我们所见,我们已经在SinglePost屏幕中成功实现了书签功能。 现在,我们可以为文章添加书签了。 但是,我们还需要在某处显示加了书签的帖子。 我们将在Bookmark.js文件的Bookmark屏幕中执行此操作。
书签索引画面
在这里,我们将实现“书签屏幕”以显示所有带有书签的文章。 我们已经在底部标签导航器中设置了“书签”屏幕的导航。 因此,我们可以在下面的仿真器屏幕中看到“书签”:
是的,我们将显示与主屏幕类似的帖子。 我们将从服务器上获取加书签的帖子,并将其显示为列表。
但是首先,我们需要定义新的状态变量,称为bookmark_post和isFetching 。 bookmark_post将存储我们从服务器获取的加书签的帖子。 并且, isFetching状态用于显示加载程序。 它们的定义如下面的代码片段所示:
class Bookmark extends Component {constructor (props) {super (props);this .state = {bookmark_post : [],isFetching : false ,};}
然后,我们需要在Bookmark.js文件中导入AsyncStorage软件包,如下面的代码片段所示:
import AsyncStorage from '@react-native-community/async-storage' ;
然后,我们需要从服务器获取加书签的帖子。 为此,我们需要定义一个名为fetchBookMark
的新函数,如下面的代码片段所示:
async fetchBookMark() {let bookmark = await AsyncStorage.getItem( 'bookmark' ).then( token => {const res = JSON .parse(token);if (res != null ) {const result = res.map( post_id => {return 'include[]=' + post_id;});return result.join( '&' );} else {return null ;}});const response = await fetch(`https://kriss.io/wp-json/wp/v2/posts? ${bookmark} `);const post = await response.json();//this.setState({ posts: post });this .setState({ bookmark_post : post });}
在这里,首先,我们从AsyncStorage获取书签数据,然后映射所有帖子ID,以在WordPress API上构建查询字符串匹配项。 然后,我们使用提取功能请求WordPress API并获得带书签的帖子的响应。 我们将响应解析为JSON,然后将其设置为bookmark_post
状态变量。
接下来,我们将使用FlatList
来显示文章列表,就像在主屏幕中一样。 总体实现如下代码片段所示:
componentDidMount() {this .fetchBookmark();}
render() {return ( Bookmark Post (this.props.navigation.navigate('SinglePost', {post_id: item.id,})}>Published on {moment(item.date).fromNow()})}keyExtractor={item => item.id}/>);}
}
我们需要记住,要像在主屏幕中一样进行导入。 并且,我们需要在componentDidMount挂钩中调用fetch函数。
因此,我们将在仿真器屏幕中获得以下结果:
在这里,我们在“书签”屏幕上获得了带有书签的帖子列表。 但是,当我们切换选项卡时,我们会看到componentDidMount不会触发。 这不好,因为书签可以每次更新。 如果不刷新“书签”屏幕,则书签帖子不会更新。
因此,在就此问题进行了头脑风暴之后,我们可以在S tackOverflow中获得解决方案。 建议通过更新类触发didFocusevent 。 现在,我们将按照文档中的内容进行配置。 首先,我们需要进行以下导入:
import {withNavigationFocus} from 'react-navigation' ;
class Bookmark extends Component {
在这里,我们进口withNavigationFocus从反应导航 。 然后,我们需要在withNavigationFocus函数内部将导出默认值移到底部,如下面的代码片段所示:
export default withNavigationFocus(Bookmark);
并且,对于侦听器事件,我们将在componentDidMount
使用它,如下面的代码片段所示:
componentDidMount() {const {navigation} = this .props;this .focusListener = navigation.addListener( 'didFocus' , () => {this .fetchBookmark();});}
因此,我们将在仿真器屏幕中获得以下结果:
如我们所见,“书签”屏幕现在每次导航到书签时都会获取书签。
摘要
在本章中,我们学习了如何删除和呈现书签。 然后,利用AsyncStorage和访存方法,我们成功访存了要加书签的帖子,以显示在“书签”屏幕上。 最后,我们学习了每次进入“书签”屏幕时如何重新获取带书签的帖子,以便显示新的书签。
本系列旨在展示我如何使用react-native构建一个应用程序以服务WordPress博客中的内容。 由于我的博客谈论的是本机反应,因此该系列和文章相互联系。 我们将学习如何设置许多使我们的生活舒适的程序包,并学习如何处理WordPress API。 在此,本书中讨论的最突出的功能是深色主题,脱机模式,无限滚动等。 您可以在本系列中找到更多。 本教程系列的灵感来自instamobile的React Native App模板
From: https://hackernoon.com/build-wordpress-client-app-with-react-native-11-remove-bookmark-932ul32ud