日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

React.js 小书 Lesson15 - 实战分析:评论功能(二)

發(fā)布時(shí)間:2024/4/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 React.js 小书 Lesson15 - 实战分析:评论功能(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 作者:胡子大哈
  • 原文鏈接:?http://huziketang.com/books/react/lesson15
  • 轉(zhuǎn)載請注明出處,保留原文鏈接和作者信息。

上一節(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 ( <div className='comment-input'> <div className='comment-field'> <span className='comment-field-name'>用戶名:</span> <div className='comment-field-input'> <input /> </div> </div> <div className='comment-field'> <span className='comment-field-name'>評論內(nèi)容:</span> <div className='comment-field-input'> <textarea /> </div> </div> <div className='comment-field-button'> <button> 發(fā)布 </button> </div> </div> ) } } export default CommentInput

在瀏覽器中可以看到?ComponentInput?的結(jié)構(gòu)和樣式都已經(jīng)生效:

因?yàn)檫€沒有加入處理邏輯,所以你輸入內(nèi)容,然后點(diǎn)擊發(fā)布是不會有什么效果的。用戶可輸入內(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)的值:

...<div className='comment-field'><span className='comment-field-name'>用戶名:</span> <div className='comment-field-input'> <input value={this.state.username} /> </div> </div> <div className='comment-field'> <span className='comment-field-name'>評論內(nèi)容:</span> <div className='comment-field-input'> <textarea value={this.state.content} /> </div> </div> ...

可以看到接受用戶名輸入的?<input />?和接受用戶評論內(nèi)容的?<textarea />?的?value?值分別由?state.username?和?state.content?控制。這時(shí)候你到瀏覽器里面去輸入內(nèi)容看看,你會發(fā)現(xiàn)你什么都輸入不了。

這是為什么呢?React.js 認(rèn)為所有的狀態(tài)都應(yīng)該由 React.js 的 state 控制,只要類似于?<input />、<textarea />、<select />?這樣的輸入控件被設(shè)置了?value?值,那么它們的值永遠(yuǎn)以被設(shè)置的值為準(zhǔn)。值不變,value?就不會變化。

例如,上面設(shè)置了?<input />?的?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)容才會更新。

...<div className='comment-field-input'><input value={this.state.username} onChange={this.handleUsernameChange.bind(this)} /> </div> ...

上面的代碼給?input?加上了?onChange?事件監(jiān)聽,綁定到?this.handleUsernameChange?方法中,該方法實(shí)現(xiàn)如下:

...handleUsernameChange (event) {this.setState({username: event.target.value})} ...

在這個(gè)方法中,我們通過?event.target.value?獲取?<input />?中用戶輸入的內(nèi)容,然后通過?setState?把它設(shè)置到?state.username?當(dāng)中,這時(shí)候組件的內(nèi)容就會更新,input?的?value?值就會得到更新并顯示到輸入框內(nèi)。這時(shí)候輸入已經(jīng)沒有問題了:

類似于?<input />、<select />、<textarea>?這些元素的?value?值被 React.js 所控制、渲染的組件,在 React.js 當(dāng)中被稱為受控組件(Controlled Component)。對于用戶可輸入的控件,一般都可以讓它們成為受控組件,這是 React.js 所推崇的做法。另外還有非受控組件,這里暫時(shí)不提及。

同樣地,讓?<textarea />?成為受控組件:

...handleContentChange (event) {this.setState({content: event.target.value})} ...<div className='comment-field'><span className='comment-field-name'>評論內(nèi)容:</span> <div className='comment-field-input'> <textarea value={this.state.content} onChange={this.handleContentChange.bind(this)} /> </div> </div> ...

向父組件傳遞數(shù)據(jù)

當(dāng)用戶在?CommentInput?里面輸入完內(nèi)容以后,點(diǎn)擊發(fā)布,內(nèi)容其實(shí)是需要顯示到?CommentList?組件當(dāng)中的。但這兩個(gè)組件明顯是單獨(dú)的、分離的組件。我們再回顧一下之前是怎么劃分組件的:

可以看到,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ā)布按鈕添加事件:

...<div className='comment-field-button'><buttononClick={this.handleSubmit.bind(this)}> 發(fā)布 </button> </div> ...

用戶點(diǎn)擊按鈕的時(shí)候會調(diào)用?this.handleSubmit?方法:

...handleSubmit () {if (this.props.onSubmit) {const { username, content } = this.statethis.props.onSubmit({username, content}) } this.setState({ content: '' }) } ...

handleSubmit?方法會判斷?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 ( <div className='wrapper'> <CommentInput onSubmit={this.handleSubmitComment.bind(this)} /> <CommentList /> </div> ) } }

在?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)的邏輯。


因?yàn)榈谌皆u論工具有問題,對本章節(jié)有任何疑問的朋友可以移步到?React.js 小書的論壇?發(fā)帖,我會回答大家的疑問。

轉(zhuǎn)載于:https://www.cnblogs.com/huzidaha/p/7813407.html

總結(jié)

以上是生活随笔為你收集整理的React.js 小书 Lesson15 - 实战分析:评论功能(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。