摘要:例如,上面設(shè)置了的為,在中被初始化為空字符串。如何向傳遞的數(shù)據(jù)父組件只需要通過給子組件傳入一個(gè)回調(diào)函數(shù)。當(dāng)用戶點(diǎn)擊發(fā)布按鈕的時(shí)候,調(diào)用中的回調(diào)函數(shù)并且將傳入該函數(shù)即可。下一節(jié)中我們將介紹小書實(shí)戰(zhàn)分析評論功能三。
React.js 小書 Lesson15 - 實(shí)戰(zhàn)分析:評論功能(二)
本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson15
轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息
在線閱讀:http://huziketang.com/books/react
上一節(jié)我們構(gòu)建了基本的代碼框架,現(xiàn)在開始完善其他的內(nèi)容。
處理用戶輸入我們從 ComponentInput 組件開始,學(xué)習(xí) React.js 是如何處理用戶輸入的。首先修改 ComponentInput.js,完善 ComponentInput 的 render 函數(shù)中的 HTML 結(jié)構(gòu):
import React, { Component } from "react" class CommentInput extends Component { render () { return () } } export default CommentInput用戶名:評論內(nèi)容:
在瀏覽器中可以看到 ComponentInput 的結(jié)構(gòu)和樣式都已經(jīng)生效:
因?yàn)檫€沒有加入處理邏輯,所以你輸入內(nèi)容,然后點(diǎn)擊發(fā)布是不會(huì)有什么效果的。用戶可輸入內(nèi)容一個(gè)是用戶名(username),一個(gè)是評論內(nèi)容(content),我們在組件的構(gòu)造函數(shù)中初始化一個(gè) state 來保存這兩個(gè)狀態(tài):
... class CommentInput extends Component { constructor () { super() this.state = { username: "", content: "" } } ... } ...
然后給輸入框設(shè)置 value 屬性,讓它們的 value 值等于 this.state 里面相應(yīng)的值:
...用戶名:評論內(nèi)容:...
可以看到接受用戶名輸入的 和接受用戶評論內(nèi)容的 的 value 值分別由 state.username 和 state.content 控制。這時(shí)候你到瀏覽器里面去輸入內(nèi)容看看,你會(huì)發(fā)現(xiàn)你什么都輸入不了。
這是為什么呢?React.js 認(rèn)為所有的狀態(tài)都應(yīng)該由 React.js 的 state 控制,只要類似于 、、 這樣的輸入控件被設(shè)置了 value 值,那么它們的值永遠(yuǎn)以被設(shè)置的值為準(zhǔn)。值不變,value 就不會(huì)變化。
例如,上面設(shè)置了 的 value 為 this.state.username,username 在 constructor 中被初始化為空字符串。即使用戶在輸入框里面嘗試輸入內(nèi)容了,還是沒有改變 this.state.username 是空字符串的事實(shí)。
所以應(yīng)該怎么做才能把用戶內(nèi)容輸入更新到輸入框當(dāng)中呢?在 React.js 當(dāng)中必須要用 setState 才能更新組件的內(nèi)容,所以我們需要做的就是:監(jiān)聽輸入框的 onChange 事件,然后獲取到用戶輸入的內(nèi)容,再通過 setState 的方式更新 state 中的 username,這樣 input 的內(nèi)容才會(huì)更新。
......
上面的代碼給 input 加上了 onChange 事件監(jiān)聽,綁定到 this.handleUsernameChange 方法中,該方法實(shí)現(xiàn)如下:
... handleUsernameChange (event) { this.setState({ username: event.target.value }) } ...
在這個(gè)方法中,我們通過 event.target.value 獲取 中用戶輸入的內(nèi)容,然后通過 setState 把它設(shè)置到 state.username 當(dāng)中,這時(shí)候組件的內(nèi)容就會(huì)更新,input 的 value 值就會(huì)得到更新并顯示到輸入框內(nèi)。這時(shí)候輸入已經(jīng)沒有問題了:
類似于 、、 這些元素的 value 值被 React.js 所控制、渲染的組件,在 React.js 當(dāng)中被稱為受控組件(Controlled Component)。對于用戶可輸入的控件,一般都可以讓它們成為受控組件,這是 React.js 所推崇的做法。另外還有非受控組件,這里暫時(shí)不提及。
同樣地,讓 成為受控組件:
... handleContentChange (event) { this.setState({ content: event.target.value }) } ...向父組件傳遞數(shù)據(jù)評論內(nèi)容:...
當(dāng)用戶在 CommentInput 里面輸入完內(nèi)容以后,點(diǎn)擊發(fā)布,內(nèi)容其實(shí)是需要顯示到 CommentList 組件當(dāng)中的。但這兩個(gè)組件明顯是多帶帶的、分離的組件。我們再回顧一下之前是怎么劃分組件的:
可以看到,CommentApp 組件將 CommentInput 和 CommentList 組合起來,它是它們倆的父組件,可以充當(dāng)橋接兩個(gè)子組件的橋梁。所以當(dāng)用戶點(diǎn)擊發(fā)布按鈕的時(shí)候,我們就將 CommentInput 的 state 當(dāng)中最新的評論數(shù)據(jù)傳遞給父組件 CommentApp ,然后讓父組件把這個(gè)數(shù)據(jù)傳遞給 CommentList 進(jìn)行渲染。
CommentInput 如何向 CommentApp 傳遞的數(shù)據(jù)?父組件 CommentApp 只需要通過 props 給子組件 CommentInput 傳入一個(gè)回調(diào)函數(shù)。當(dāng)用戶點(diǎn)擊發(fā)布按鈕的時(shí)候,CommentInput 調(diào)用 props 中的回調(diào)函數(shù)并且將 state 傳入該函數(shù)即可。
先給發(fā)布按鈕添加事件:
......
用戶點(diǎn)擊按鈕的時(shí)候會(huì)調(diào)用 this.handleSumit 方法:
... handleSubmit () { if (this.props.onSubmit) { const { username, content } = this.state this.props.onSubmit({username, content}) } this.setState({ content: "" }) } ...
handleSumit 方法會(huì)判斷 props 中是否傳入了 onSubmit 屬性。有的話就調(diào)用該函數(shù),并且把用戶輸入的用戶名和評論數(shù)據(jù)傳入該函數(shù)。然后再通過 setState 清空用戶輸入的評論內(nèi)容(但為了用戶體驗(yàn),保留輸入的用戶名)。
修改 CommentApp.js ,讓它可以通過傳入回調(diào)來獲取到新增評論數(shù)據(jù):
class CommentApp extends Component { handleSubmitComment (comment) { console.log(comment) } render() { return () } }
在 CommentApp 中給 CommentInput 傳入一個(gè) onSubmit 屬性,這個(gè)屬性值是 CommentApp 自己的一個(gè)方法 handleSubmitComment。這樣 CommentInput 就可以調(diào)用 this.props.onSubmit(…) 把數(shù)據(jù)傳給 CommenApp。
現(xiàn)在在 CommentInput 中輸入完評論內(nèi)容以后點(diǎn)擊發(fā)布,就可以看到 CommentApp 在控制臺打印的數(shù)據(jù):
這樣就順利地把數(shù)據(jù)傳遞給了父組件,接下來我們開始處理評論列表相關(guān)的邏輯。
下一節(jié)中我們將介紹《React.js 小書 Lesson16 - 實(shí)戰(zhàn)分析:評論功能(三)》。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89688.html
摘要:因?yàn)楣ぷ髦幸恢痹谑褂茫惨恢币詠硐肟偨Y(jié)一下自己關(guān)于的一些知識經(jīng)驗(yàn)。于是把一些想法慢慢整理書寫下來,做成一本開源免費(fèi)專業(yè)簡單的入門級別的小書,提供給社區(qū)。本書的后續(xù)可能會(huì)做成視頻版本,敬請期待。本作品采用署名禁止演繹國際許可協(xié)議進(jìn)行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:對于上面這個(gè)評論功能,可以粗略地劃分成以下幾部分評論功能的整體用一個(gè)叫的組件包含起來。每個(gè)評論列表項(xiàng)由獨(dú)立的組件負(fù)責(zé)顯示,這個(gè)組件被所使用。下一節(jié)中我們將介紹小書實(shí)戰(zhàn)分析評論功能二。 React.js 小書 Lesson14 - 實(shí)戰(zhàn)分析:評論功能(一) 本文作者:胡子大哈本文原文:http://react.huziketang.com/blog/lesson14 轉(zhuǎn)載請注明出處,保...
摘要:所以我們給評論組件加上刪除評論的功能,這樣就可以刪除不想要的評論了。輸入這是代碼塊,這是正常內(nèi)容。到目前為止,第二階段的實(shí)戰(zhàn)已經(jīng)全部完成,你可以在這里找到完整的代碼。下一節(jié)中我們將介紹小書高階組件。 React.js 小書 Lesson27 - 實(shí)戰(zhàn)分析:評論功能(六) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson27 ...
摘要:接下來是實(shí)戰(zhàn)環(huán)節(jié),我們會(huì)繼續(xù)上一階段的例子,把評論功能做得更加復(fù)雜一點(diǎn)。把已經(jīng)發(fā)布的評論持久化,存放到瀏覽器的中。評論顯示發(fā)布日期,如秒前,分鐘前,并且會(huì)每隔秒更新發(fā)布日期。事件監(jiān)聽方法,。下一節(jié)中我們將介紹小書實(shí)戰(zhàn)分析評論功能五。 React.js 小書 Lesson25 - 實(shí)戰(zhàn)分析:評論功能(四) 本文作者:胡子大哈本文原文:http://huziketang.com/book...
摘要:但是給傳遞的評論數(shù)據(jù)并沒有傳遞給,所以現(xiàn)在發(fā)表評論時(shí)沒有反應(yīng)的。包括實(shí)現(xiàn)功能之前先理解分析需求,劃分組件。到此為止,小書的第一階段已經(jīng)結(jié)束,你可以利用這些知識點(diǎn)來構(gòu)建簡單的功能模塊了。 React.js 小書 Lesson16 - 實(shí)戰(zhàn)分析:評論功能(三) 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson16 轉(zhuǎn)載請注明出處...
閱讀 2771·2021-09-24 10:34
閱讀 1875·2021-09-22 10:02
閱讀 2262·2021-09-09 09:33
閱讀 1466·2021-08-13 15:02
閱讀 3277·2020-12-03 17:10
閱讀 1191·2019-08-30 15:44
閱讀 2152·2019-08-30 12:58
閱讀 3236·2019-08-26 13:40