摘要:但是給傳遞的評(píng)論數(shù)據(jù)并沒有傳遞給,所以現(xiàn)在發(fā)表評(píng)論時(shí)沒有反應(yīng)的。包括實(shí)現(xiàn)功能之前先理解分析需求,劃分組件。到此為止,小書的第一階段已經(jīng)結(jié)束,你可以利用這些知識(shí)點(diǎn)來構(gòu)建簡單的功能模塊了。
React.js 小書 Lesson16 - 實(shí)戰(zhàn)分析:評(píng)論功能(三)
本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson16
轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息
在線閱讀:http://huziketang.com/books/react
接下來的代碼比較順理成章了。修改 CommentList 可以讓它可以顯示評(píng)論列表:
// CommentList.js import React, { Component } from "react" class CommentList extends Component { render() { const comments = [ {username: "Jerry", content: "Hello"}, {username: "Tomy", content: "World"}, {username: "Lucy", content: "Good"} ] return ({comments.map((comment, i) => { return () } } export default CommentList{comment.username}:{comment.content}) })}
這里的代碼沒有什么新鮮的內(nèi)容,只不過是建立了一個(gè) comments 的數(shù)組來存放一些測(cè)試數(shù)據(jù)的內(nèi)容,方便我們后續(xù)測(cè)試。然后把 comments 的數(shù)據(jù)渲染到頁面上,這跟我們之前講解的章節(jié)的內(nèi)容一樣——使用 map 構(gòu)建一個(gè)存放 JSX 的數(shù)組。就可以在瀏覽器看到效果:
修改 Comment.js 讓它來負(fù)責(zé)具體每條評(píng)論內(nèi)容的渲染:
import React, { Component } from "react" class Comment extends Component { render () { return () } } export default Comment{this.props.comment.username} :{this.props.comment.content}
這個(gè)組件可能是我們案例里面最簡單的組件了,它只負(fù)責(zé)每條評(píng)論的具體顯示。你只需要給它的 props 中傳入一個(gè) comment 對(duì)象,它就會(huì)把該對(duì)象中的 username 和 content 渲染到頁面上。
馬上把 Comment 應(yīng)用到 CommentList 當(dāng)中,修改 CommentList.js 代碼:
import React, { Component } from "react" import Comment from "./Comment" class CommentList extends Component { render() { const comments = [ {username: "Jerry", content: "Hello"}, {username: "Tomy", content: "World"}, {username: "Lucy", content: "Good"} ] return ({comments.map((comment, i) =>) } } export default CommentList)}
可以看到測(cè)試數(shù)據(jù)顯示到了頁面上:
之前我們說過 CommentList 的數(shù)據(jù)應(yīng)該是由父組件 CommentApp 傳進(jìn)來的,現(xiàn)在我們刪除測(cè)試數(shù)據(jù),改成從 props 獲取評(píng)論數(shù)據(jù):
import React, { Component } from "react" import Comment from "./Comment" class CommentList extends Component { render() { return ({this.props.comments.map((comment, i) =>) } } export default CommentList)}
這時(shí)候可以看到瀏覽器報(bào)錯(cuò)了:
這是因?yàn)?b>CommentApp 使用 CommentList 的時(shí)候并沒有傳入 comments。我們給 CommentList 加上 defaultProps 防止 comments 不傳入的情況:
class CommentList extends Component { static defaultProps = { comments: [] } ...
這時(shí)候代碼就不報(bào)錯(cuò)了。但是 CommentInput 給 CommentApp 傳遞的評(píng)論數(shù)據(jù)并沒有傳遞給 CommentList,所以現(xiàn)在發(fā)表評(píng)論時(shí)沒有反應(yīng)的。
我們?cè)?CommentApp 的 state 中初始化一個(gè)數(shù)組,來保存所有的評(píng)論數(shù)據(jù),并且通過 props 把它傳遞給 CommentList。修改 CommentApp.js:
import React, { Component } from "react" import CommentInput from "./CommentInput" import CommentList from "./CommentList" class CommentApp extends Component { constructor () { super() this.state = { comments: [] } } handleSubmitComment (comment) { console.log(comment) } render() { return () } } export default CommentApp
接下來,修改 handleSubmitComment :每當(dāng)用戶發(fā)布評(píng)論的時(shí)候,就把評(píng)論數(shù)據(jù)插入 this.state.comments 中,然后通過 setState 把數(shù)據(jù)更新到頁面上:
... handleSubmitComment (comment) { this.state.comments.push(comment) this.setState({ comments: this.state.comments }) } ...
現(xiàn)在代碼應(yīng)該是可以按照需求正常運(yùn)作了,輸入用戶名和評(píng)論內(nèi)容,然后點(diǎn)擊發(fā)布:
為了讓代碼的健壯性更強(qiáng),給 handleSubmitComment 加入簡單的數(shù)據(jù)檢查:
... handleSubmitComment (comment) { if (!comment) return if (!comment.username) return alert("請(qǐng)輸入用戶名") if (!comment.content) return alert("請(qǐng)輸入評(píng)論內(nèi)容") this.state.comments.push(comment) this.setState({ comments: this.state.comments }) } ...
到這里,我們的第一個(gè)實(shí)戰(zhàn)案例——評(píng)論功能已經(jīng)完成了!完整的案例代碼可以在這里 comment-app 找到, 在線演示 體驗(yàn)。
總結(jié)在這個(gè)案例里面,我們除了復(fù)習(xí)了之前所學(xué)過的內(nèi)容以外還學(xué)習(xí)了新的知識(shí)點(diǎn)。包括:
實(shí)現(xiàn)功能之前先理解、分析需求,劃分組件。并且掌握劃分組件的基本原則——可復(fù)用性、可維護(hù)性。
受控組件的概念,React.js 中的 、、 等元素的 value 值如果是受到 React.js 的控制,那么就是受控組件。
組件之間使用 props 通過父元素傳遞數(shù)據(jù)的技巧。
當(dāng)然,在真實(shí)的項(xiàng)目當(dāng)中,這個(gè)案例很多地方是可以優(yōu)化的。包括組件可復(fù)用性方面(有沒有發(fā)現(xiàn)其實(shí) CommentInput 中有重復(fù)的代碼?)、應(yīng)用的狀態(tài)管理方面。但在這里為了給大家總結(jié)和演示,實(shí)現(xiàn)到這個(gè)程度也就足夠了。
到此為止,React.js 小書的第一階段已經(jīng)結(jié)束,你可以利用這些知識(shí)點(diǎn)來構(gòu)建簡單的功能模塊了。但是在實(shí)際項(xiàng)目如果要構(gòu)建比較系統(tǒng)和完善的功能,還需要更多的 React.js 的知識(shí)還有關(guān)于前端開發(fā)的一些認(rèn)知來協(xié)助我們。接下來我們會(huì)開啟新的一個(gè)階段來學(xué)習(xí)更多關(guān)于 React.js 的知識(shí),以及如何更加靈活和熟練地使用它們。讓我們進(jìn)入第二階段吧!
下一節(jié)中我們將介紹《React.js 小書 Lesson17 - 前端應(yīng)用狀態(tài)管理 —— 狀態(tài)提升)》。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89687.html
摘要:因?yàn)楣ぷ髦幸恢痹谑褂茫惨恢币詠硐肟偨Y(jié)一下自己關(guān)于的一些知識(shí)經(jīng)驗(yàn)。于是把一些想法慢慢整理書寫下來,做成一本開源免費(fèi)專業(yè)簡單的入門級(jí)別的小書,提供給社區(qū)。本書的后續(xù)可能會(huì)做成視頻版本,敬請(qǐng)期待。本作品采用署名禁止演繹國際許可協(xié)議進(jìn)行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:例如,上面設(shè)置了的為,在中被初始化為空字符串。如何向傳遞的數(shù)據(jù)父組件只需要通過給子組件傳入一個(gè)回調(diào)函數(shù)。當(dāng)用戶點(diǎn)擊發(fā)布按鈕的時(shí)候,調(diào)用中的回調(diào)函數(shù)并且將傳入該函數(shù)即可。下一節(jié)中我們將介紹小書實(shí)戰(zhàn)分析評(píng)論功能三。 React.js 小書 Lesson15 - 實(shí)戰(zhàn)分析:評(píng)論功能(二) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/les...
摘要:修改請(qǐng)輸入用戶名請(qǐng)輸入評(píng)論內(nèi)容我們?cè)黾恿撕头謩e用于加載和保存評(píng)論列表數(shù)據(jù)?,F(xiàn)在發(fā)布評(píng)論,然后刷新可以看到我們的評(píng)論并不會(huì)像以前一樣消失。非常的不錯(cuò),持久化評(píng)論的功能也完成了。下一節(jié)中我們將介紹小書實(shí)戰(zhàn)分析評(píng)論功能六。 React.js 小書 Lesson26 - 實(shí)戰(zhàn)分析:評(píng)論功能(五) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/...
摘要:對(duì)于上面這個(gè)評(píng)論功能,可以粗略地劃分成以下幾部分評(píng)論功能的整體用一個(gè)叫的組件包含起來。每個(gè)評(píng)論列表項(xiàng)由獨(dú)立的組件負(fù)責(zé)顯示,這個(gè)組件被所使用。下一節(jié)中我們將介紹小書實(shí)戰(zhàn)分析評(píng)論功能二。 React.js 小書 Lesson14 - 實(shí)戰(zhàn)分析:評(píng)論功能(一) 本文作者:胡子大哈本文原文:http://react.huziketang.com/blog/lesson14 轉(zhuǎn)載請(qǐng)注明出處,保...
摘要:所以我們給評(píng)論組件加上刪除評(píng)論的功能,這樣就可以刪除不想要的評(píng)論了。輸入這是代碼塊,這是正常內(nèi)容。到目前為止,第二階段的實(shí)戰(zhàn)已經(jīng)全部完成,你可以在這里找到完整的代碼。下一節(jié)中我們將介紹小書高階組件。 React.js 小書 Lesson27 - 實(shí)戰(zhàn)分析:評(píng)論功能(六) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson27 ...
閱讀 3161·2021-11-22 12:01
閱讀 3781·2021-08-30 09:46
閱讀 796·2019-08-30 13:48
閱讀 3230·2019-08-29 16:43
閱讀 1674·2019-08-29 16:33
閱讀 1864·2019-08-29 13:44
閱讀 1428·2019-08-26 13:45
閱讀 2242·2019-08-26 11:44