摘要:本文主要是使用和來(lái)實(shí)現(xiàn)一個(gè)聊天功能的頁(yè)面,頁(yè)面極其簡(jiǎn)單。具體關(guān)于的介紹,戳這里。只是一個(gè)簡(jiǎn)單的表示操作動(dòng)作的對(duì)象。很顯然,除了是簡(jiǎn)單的對(duì)象之外,還有兩個(gè)相對(duì)復(fù)雜的函數(shù)。而則是將新的消息推到上。頁(yè)面主體的組件。
本文主要是使用ReactJs和Redux來(lái)實(shí)現(xiàn)一個(gè)聊天功能的頁(yè)面,頁(yè)面極其簡(jiǎn)單。使用React時(shí)間不長(zhǎng),還是個(gè)noob,有不對(duì)之處歡迎大家吐槽指正。
還要指出這里沒(méi)有使用到websocket等技術(shù)來(lái)實(shí)現(xiàn)后端邏輯,而是使用了wilddog充當(dāng)后端。具體關(guān)于wilddog的介紹,戳這里。
目標(biāo):我期望的頁(yè)面長(zhǎng)這樣,一個(gè)簡(jiǎn)單的消息列表,下面有個(gè)輸入框和提交按鈕,任何人可以在上面說(shuō)話(huà),并可以看到別人說(shuō)的話(huà),就這么簡(jiǎn)單。
1. React和Redux
React這么火,我就不多說(shuō)了。Redux是一個(gè)類(lèi)flux的應(yīng)用框架,和flux一樣是單向數(shù)據(jù)流,目前用來(lái)主要是對(duì)flux進(jìn)行了一些優(yōu)化,如將action變?yōu)楹?jiǎn)單的對(duì)象,store也是一個(gè)簡(jiǎn)單的對(duì)象樹(shù),引入了reducer來(lái)處理action,reducer本身是pure function,調(diào)試起來(lái)也極為方便,還可以配合使用hot-loader以及redux-dev-tool實(shí)現(xiàn)time travel調(diào)試功能,用起來(lái)還是有點(diǎn)爽爽的感覺(jué)。
2. 開(kāi)始coding
"不想看扯淡,只要看源碼的"戳這里:D。
文件目錄是這樣的:
項(xiàng)目是使用webpack打包的,也用了dev-server,有興趣的同學(xué)可以自己看webpack目錄和server.js。
這里主要關(guān)注src下面的內(nèi)容:
store創(chuàng)建一個(gè)唯一的store,存放項(xiàng)目中所有的數(shù)據(jù)。
reducers: 初始化store的部分內(nèi)容,在這里是個(gè)空對(duì)象。還有處理store的函數(shù),這里只有一個(gè)init的工作,就是用action中傳過(guò)來(lái)的chats字段替換當(dāng)前的state,這里的業(yè)務(wù)邏輯對(duì)應(yīng)的是,每當(dāng)聊天室有新的消息傳過(guò)來(lái),都會(huì)整個(gè)替換當(dāng)前的聊天內(nèi)容,這里可能會(huì)有疑問(wèn)為什么要這樣,主要是因?yàn)閣ilddog傳給我的就是一個(gè)完整的列表,后面仔細(xì)會(huì)介紹wilddog。
const initialState = {
};
export function chat(state = initialState, action) {
switch (action.type) { case INIT_CHAT: return Object.assign({},state,action.chats); default: return state; }
}
action : 只是一個(gè)簡(jiǎn)單的表示操作動(dòng)作的對(duì)象。
export function init(chats){ return { type : INIT_CHAT, chats }
}
export function getChats(){
return function(dispatch){ ref = new Wilddog("https://firstblood.wilddogio.com/"); ref.on("value", function(snapshot) { console.log(snapshot.val()); dispatch(init(snapshot.val())); }, function (errorObject) { console.log("The read failed: " + errorObject.code); }); }
}
export function postMsg(msg){
return function(dispatch){ var postsRef = ref.child("msgs"); postsRef.push({ date: Date.now(), msg }); }
}
很顯然,除了init是簡(jiǎn)單的對(duì)象之外,還有兩個(gè)相對(duì)復(fù)雜的函數(shù)。這里用到redux-thunk,其作用就是把一些比較復(fù)雜的動(dòng)作(例如這里用到的異步操作)封裝到一個(gè)action中去,redux-thunk是redux的一個(gè)middleware,redux的dispatch無(wú)法處理對(duì)象之外的內(nèi)容,例如函數(shù),將redux-thunk放進(jìn)去了就可以了:
import thunkMiddleware from "redux-thunk";
const createStoreWithMiddleware = compose(
applyMiddleware( thunkMiddleware, logger ), window.devToolsExtension ? window.devToolsExtension() : f => f
)(createStore);
這里的getChats()首先新建了一個(gè)wilddog實(shí)例,連接我在wilddog上定義好的項(xiàng)目上,
野狗提供的on()函數(shù)可以通過(guò)websocket來(lái)監(jiān)聽(tīng)數(shù)據(jù)是否發(fā)生了變化,正如這里寫(xiě)的,每當(dāng)數(shù)據(jù)發(fā)生變化都會(huì)dispatch一次init動(dòng)作,來(lái)將頁(yè)面的數(shù)據(jù)重新渲染。
而postMsg則是將新的消息推到wilddog上。這樣會(huì)出發(fā)wilddog的數(shù)據(jù)變化,然后反過(guò)來(lái)會(huì)觸發(fā)我們之前定義在on()回調(diào)里面的內(nèi)容,及重新獲取數(shù)據(jù),渲染頁(yè)面。
container/chat.js: 頁(yè)面主體的react組件。首先將這個(gè)react組件和redux的store關(guān)聯(lián)起來(lái),這里用到的react-redux中的connect函數(shù),在注解里完成了:
@connect( state => state.chat, dispatch => bindActionCreators(actionCreators, dispatch)
)
大家是否還記得我們之前定義好了獲取頁(yè)面初始消息列表的getChats函數(shù),在這里被調(diào)用:
componentDidMount(){ this.props.getChats(); this.setState({ input : "" }); }
讓我們來(lái)關(guān)注頁(yè)面html的代碼,首先是消息列表:
Chat { _msgList.map((msg,index)=>) } } primaryText = {moment(msg.date).format("YYYY-MM-DD HH:mm:ss")} secondaryText={ {msg.msg}
} secondaryTextLines={1}/>
循環(huán)_msgList來(lái)輸出每一條消息,這里用到List,ListItem是material-ui中的。這個(gè)_msgList是從store中取出的:
const { msgs } = this.props; let _msgList = []; for(let i in msgs){ _msgList.push(msgs[i]); }
接下來(lái)是輸入框和say按鈕部分的代碼:
可以看到是主要是一個(gè)表單提交的工作,handleSubmit即表單提交的函數(shù):
handleSubmit = (event)=>{ event.preventDefault(); if(!this.refs.input.getValue())return; this.props.postMsg(this.refs.input.getValue()); this.refs.main.scrollTop = 10000; this.setState({ input : "" }); };
這里最重要的是this.props.postMsg,調(diào)用的是之前定義在action中的postMsg函數(shù)完成新增消息的操做。
到目前位置代碼部分就完了,這里可以試試demo,我用的wilddog個(gè)人免費(fèi)版,資源有限,別整掛了:P
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87728.html
摘要:最近練手開(kāi)發(fā)了一個(gè)項(xiàng)目,是一個(gè)聊天室應(yīng)用。由于我們的項(xiàng)目是一個(gè)單頁(yè)面應(yīng)用,因此只需要統(tǒng)一打包出一個(gè)和一個(gè)。而就是基于實(shí)現(xiàn)的一套基于事件訂閱與發(fā)布的通信庫(kù)。比如說(shuō),某一個(gè)端口了,而如果端口訂閱了,那么在端,對(duì)應(yīng)的回調(diào)函數(shù)就會(huì)被執(zhí)行。 最近練手開(kāi)發(fā)了一個(gè)項(xiàng)目,是一個(gè)聊天室應(yīng)用。項(xiàng)目雖不大,但是使用到了react, react-router, redux, socket.io,后端開(kāi)發(fā)使用了...
awesome-github-wechat-weapp 是由OpenDigg整理并維護(hù)的微信小程序開(kāi)源項(xiàng)目庫(kù)集合。我們會(huì)定期同步上的項(xiàng)目到這里,也歡迎各位 UI組件開(kāi)發(fā)框架實(shí)用庫(kù)開(kāi)發(fā)工具服務(wù)端項(xiàng)目實(shí)例Demo UI組件 weui-wxss ★1873 - 同微信原生視覺(jué)體驗(yàn)一致的基礎(chǔ)樣式庫(kù)zanui-weapp ★794 - 好用易擴(kuò)展的小程序 UI 庫(kù)wx-charts ★449 - 微信小程...
摘要:利用中間件實(shí)現(xiàn)異步請(qǐng)求,實(shí)現(xiàn)兩個(gè)用戶(hù)角色實(shí)時(shí)通信。目前還未深入了解的一些概念。往后會(huì)寫(xiě)更多的前后臺(tái)聯(lián)通的項(xiàng)目。刪除分組會(huì)連同組內(nèi)的所有圖片一起刪除。算是對(duì)自己上次用寫(xiě)后臺(tái)的一個(gè)強(qiáng)化,項(xiàng)目文章在這里。后來(lái)一直沒(méi)動(dòng),前些日子才把后續(xù)的完善。 歡迎訪(fǎng)問(wèn)我的個(gè)人網(wǎng)站:http://www.neroht.com/? 剛學(xué)vue和react時(shí),利用業(yè)余時(shí)間寫(xiě)的關(guān)于這兩個(gè)框架的訓(xùn)練,都相對(duì)簡(jiǎn)單,有的...
摘要:異步最佳實(shí)踐避免回調(diào)地獄前端掘金本文涵蓋了處理異步操作的一些工具和技術(shù)和異步函數(shù)。 Nodejs 連接各種數(shù)據(jù)庫(kù)集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 編寫(xiě) Node.js Rest API 的 10 個(gè)最佳實(shí)踐 - 前端 - 掘金全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自...
摘要:前端每周清單半年盤(pán)點(diǎn)之與篇前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開(kāi)發(fā)教程工程實(shí)踐深度閱讀開(kāi)源項(xiàng)目巔峰人生等欄目。與求同存異近日,宣布將的構(gòu)建工具由遷移到,引發(fā)了很多開(kāi)發(fā)者的討論。 前端每周清單半年盤(pán)點(diǎn)之 React 與 ReactNative 篇 前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為...
閱讀 3789·2023-04-25 21:09
閱讀 3136·2021-10-20 13:48
閱讀 3044·2021-09-24 10:25
閱讀 2942·2021-08-21 14:08
閱讀 1800·2019-08-30 15:56
閱讀 989·2019-08-30 15:52
閱讀 1856·2019-08-29 14:11
閱讀 3575·2019-08-29 11:01