摘要:修改請(qǐng)輸入用戶(hù)名請(qǐng)輸入評(píng)論內(nèi)容我們?cè)黾恿撕头謩e用于加載和保存評(píng)論列表數(shù)據(jù)。現(xiàn)在發(fā)布評(píng)論,然后刷新可以看到我們的評(píng)論并不會(huì)像以前一樣消失。非常的不錯(cuò),持久化評(píng)論的功能也完成了。下一節(jié)中我們將介紹小書(shū)實(shí)戰(zhàn)分析評(píng)論功能六。
React.js 小書(shū) Lesson26 - 實(shí)戰(zhàn)分析:評(píng)論功能(五)
本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson26
轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息
在線(xiàn)閱讀:http://huziketang.com/books/react
持久化評(píng)論同樣地,可以通過(guò)類(lèi)似于用戶(hù)名持久化的方式對(duì)評(píng)論列表內(nèi)容進(jìn)行持久化,讓用戶(hù)發(fā)布的評(píng)論在刷新頁(yè)面以后依然可以存在。修改 src/CommentApp.js:
class CommentApp extends Component { constructor () { super() this.state = { comments: [] } } componentWillMount () { this._loadComments() } _loadComments () { let comments = localStorage.getItem("comments") if (comments) { comments = JSON.parse(comments) this.setState({ comments }) } } _saveComments (comments) { localStorage.setItem("comments", JSON.stringify(comments)) } handleSubmitComment (comment) { if (!comment) return if (!comment.username) return alert("請(qǐng)輸入用戶(hù)名") if (!comment.content) return alert("請(qǐng)輸入評(píng)論內(nèi)容") const comments = this.state.comments comments.push(comment) this.setState({ comments }) this._saveComments(comments) } ...
我們?cè)黾恿?_loadComments 和 _saveComments 分別用于加載和保存評(píng)論列表數(shù)據(jù)。用戶(hù)每次提交評(píng)論都會(huì)把評(píng)論列表數(shù)據(jù)保存一次,所以我們?cè)?handleSubmitComment 調(diào)用 _saveComments 方法;而在 componentWillMount 中調(diào)用 _loadComments 方法,在組件開(kāi)始掛載的時(shí)候把評(píng)論列表數(shù)據(jù)加載出來(lái) setState 到 this.state 當(dāng)中,組件就可以渲染從 LocalStorage 從加載出來(lái)的評(píng)論列表數(shù)據(jù)了。
現(xiàn)在發(fā)布評(píng)論,然后刷新可以看到我們的評(píng)論并不會(huì)像以前一樣消失。非常的不錯(cuò),持久化評(píng)論的功能也完成了。
顯示評(píng)論發(fā)布時(shí)間現(xiàn)在我們給每條評(píng)論都加上發(fā)布的日期,并且在評(píng)論列表項(xiàng)上顯示已經(jīng)發(fā)表了多久,例如“1 秒前”、“30分鐘前”,并且會(huì)每隔 5 秒進(jìn)行更新。修改 src/CommentInput.js 當(dāng)用戶(hù)點(diǎn)擊發(fā)布按鈕的時(shí)候,傳出去的評(píng)論數(shù)據(jù)帶上評(píng)論發(fā)布的時(shí)間戳:
... handleSubmit () { if (this.props.onSubmit) { this.props.onSubmit({ username: this.state.username, content: this.state.content, createdTime: +new Date() }) } this.setState({ content: "" }) } ...
在評(píng)論列表項(xiàng)上顯示評(píng)論,修改 src/comment.js:
class Comment extends Component { static propTypes = { comment: PropTypes.object.isRequired } constructor () { super() this.state = { timeString: "" } } componentWillMount () { this._updateTimeString() } _updateTimeString () { const comment = this.props.comment const duration = (+Date.now() - comment.createdTime) / 1000 this.setState({ timeString: duration > 60 ? `${Math.round(duration / 60)} 分鐘前` : `${Math.round(Math.max(duration, 1))} 秒前` }) } render () { return () } }{this.props.comment.username} :{this.props.comment.content}
{this.state.timeString}
每個(gè) Comment 組件實(shí)例會(huì)保存一個(gè) timeString 狀態(tài),用于該評(píng)論顯示發(fā)布了多久。_updateTimeString 這個(gè)私有方法會(huì)根據(jù) props.comment 里面的 createdTime 來(lái)更新這個(gè) timeString:計(jì)算當(dāng)前時(shí)間和評(píng)論發(fā)布時(shí)間的時(shí)間差,如果已經(jīng)發(fā)布 60 秒以上就顯示分鐘,否則就顯示秒。然后 componentWillMount 會(huì)在組件掛載階段調(diào)用 _updateTimeString 更新一下這個(gè)字符串,render() 方法就把這個(gè)顯示時(shí)間差的字符串渲染到一個(gè) 上。
再看看頁(yè)面顯示:
這時(shí)候的時(shí)間是不會(huì)自動(dòng)更新的。除非你手動(dòng)刷新頁(yè)面,否則永遠(yuǎn)顯示“1 秒前”。我們可以在 componentWillMount 中啟動(dòng)一個(gè)定時(shí)器,每隔 5 秒調(diào)用一下 _updateTimeString,讓它去通過(guò) setState 更新 timeString:
... componentWillMount () { this._updateTimeString() this._timer = setInterval( this._updateTimeString.bind(this), 5000 ) } ...
這樣就可以做到評(píng)論的發(fā)布時(shí)間自動(dòng)刷新了,到這里前 4 個(gè)需求都已經(jīng)完成了。
下一節(jié)中我們將介紹《React.js 小書(shū) Lesson27 - 實(shí)戰(zhàn)分析:評(píng)論功能(六)》。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89677.html
摘要:因?yàn)楣ぷ髦幸恢痹谑褂茫惨恢币詠?lái)想總結(jié)一下自己關(guān)于的一些知識(shí)經(jīng)驗(yàn)。于是把一些想法慢慢整理書(shū)寫(xiě)下來(lái),做成一本開(kāi)源免費(fèi)專(zhuān)業(yè)簡(jiǎn)單的入門(mén)級(jí)別的小書(shū),提供給社區(qū)。本書(shū)的后續(xù)可能會(huì)做成視頻版本,敬請(qǐng)期待。本作品采用署名禁止演繹國(guó)際許可協(xié)議進(jìn)行許可 React.js 小書(shū) 本文作者:胡子大哈本文原文:React.js 小書(shū) 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息 在線(xiàn)閱讀:http://huzi...
摘要:接下來(lái)是實(shí)戰(zhàn)環(huán)節(jié),我們會(huì)繼續(xù)上一階段的例子,把評(píng)論功能做得更加復(fù)雜一點(diǎn)。把已經(jīng)發(fā)布的評(píng)論持久化,存放到瀏覽器的中。評(píng)論顯示發(fā)布日期,如秒前,分鐘前,并且會(huì)每隔秒更新發(fā)布日期。事件監(jiān)聽(tīng)方法,。下一節(jié)中我們將介紹小書(shū)實(shí)戰(zhàn)分析評(píng)論功能五。 React.js 小書(shū) Lesson25 - 實(shí)戰(zhàn)分析:評(píng)論功能(四) 本文作者:胡子大哈本文原文:http://huziketang.com/book...
摘要:但是給傳遞的評(píng)論數(shù)據(jù)并沒(méi)有傳遞給,所以現(xiàn)在發(fā)表評(píng)論時(shí)沒(méi)有反應(yīng)的。包括實(shí)現(xiàn)功能之前先理解分析需求,劃分組件。到此為止,小書(shū)的第一階段已經(jīng)結(jié)束,你可以利用這些知識(shí)點(diǎn)來(lái)構(gòu)建簡(jiǎn)單的功能模塊了。 React.js 小書(shū) Lesson16 - 實(shí)戰(zhàn)分析:評(píng)論功能(三) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson16 轉(zhuǎn)載請(qǐng)注明出處...
摘要:對(duì)于上面這個(gè)評(píng)論功能,可以粗略地劃分成以下幾部分評(píng)論功能的整體用一個(gè)叫的組件包含起來(lái)。每個(gè)評(píng)論列表項(xiàng)由獨(dú)立的組件負(fù)責(zé)顯示,這個(gè)組件被所使用。下一節(jié)中我們將介紹小書(shū)實(shí)戰(zhàn)分析評(píng)論功能二。 React.js 小書(shū) Lesson14 - 實(shí)戰(zhàn)分析:評(píng)論功能(一) 本文作者:胡子大哈本文原文:http://react.huziketang.com/blog/lesson14 轉(zhuǎn)載請(qǐng)注明出處,保...
摘要:例如,上面設(shè)置了的為,在中被初始化為空字符串。如何向傳遞的數(shù)據(jù)父組件只需要通過(guò)給子組件傳入一個(gè)回調(diào)函數(shù)。當(dāng)用戶(hù)點(diǎn)擊發(fā)布按鈕的時(shí)候,調(diào)用中的回調(diào)函數(shù)并且將傳入該函數(shù)即可。下一節(jié)中我們將介紹小書(shū)實(shí)戰(zhàn)分析評(píng)論功能三。 React.js 小書(shū) Lesson15 - 實(shí)戰(zhàn)分析:評(píng)論功能(二) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/les...
閱讀 2053·2023-04-26 02:23
閱讀 1794·2021-09-03 10:30
閱讀 1358·2019-08-30 15:43
閱讀 1198·2019-08-29 16:29
閱讀 542·2019-08-29 12:28
閱讀 2340·2019-08-26 12:13
閱讀 2196·2019-08-26 12:01
閱讀 2408·2019-08-26 11:56