比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > BTC > Info

昨天的區塊鏈「百度貼吧」還差一個用戶界面 代碼都在這兒_POS

Author:

Time:1900/1/1 0:00:00

本文目的很明確:手把手教你使用DApp開發框架Embark構建一個去中心化百度貼吧,主要包括以下3部分:

明確DApp需求,部署智能合約;

使用EmbarkJS測試智能合約;

使用React構建DApp的前端。

在上一篇文章中,營長手把手帶你們使用Solidity語言部署合約,并使用EmbarkJS完成智能合約測試,本文基于此將繼續深入,使用JavaScript用戶界面框架React構建去中心化百度貼吧的前端。

渲染第一個組件

在構建與智能合約實例交互的組件之前,我們需要先在屏幕上實際渲染一個簡單的文本,以確保React框架已經得到了正確的配置。

為此,我們需要將React框架添加為項目的依賴項。事實上,我們的代碼依賴兩個程序包:react和react-dom。之所以需要react-dom是因為它可以在DOM(DocumentObjectModel,文檔對象模型)環境中渲染使用React框架定義的組件,聽起來令人摸不著頭腦,簡單來說這就是瀏覽器所做的工作。

接下來我們需要將這兩個依賴項添加到項目的package

...}

接下來,我們將該狀態綁定到表單字段:

TopicPost你可能會問代碼中的loading是干嘛的,別著急,我們馬上會說到它。最后但同樣重要的是,我們需要添加一些事件處理程序,以便在用戶輸入數據時視圖中的更改能傳遞回組件并更新組件的狀態。為了確保一切正常,我們還需要為表單提交添加一個事件處理程序,讓它輸出狀態對象state中的數據,換句話說,我們需要更新處理程序handleChange()和創建帖子處理程序createPost(),代碼如下:

推特用戶:昨天賣出和買入的NFT比過去3個月中的任何一天都多:金色財經報道,據推特用戶Manta在社交媒體上稱,昨天賣出和買入的NFT比過去3個月中的任何一天都多。[2023/1/7 10:59:11]

exportclassCreatePostextendsComponent{..

createPost(event){event

...}

請注意代碼中更新處理程序handleChange()的實現方式,我們在其中使用了設置狀態函數setState()來更新傳遞給該函數的值。現在我們需要做的就是將這些處理程序附加到表單中:

createPost(e。>TopichandleChange('topic',e。/>handleChange('content',e})>Post由于我們正在使用表單的onSubmit()處理程序,因此很重要的一點就是將type=“submit”添加到按鈕對象button中,或將按鈕對象更改為,否則,表單將不會發出提交事件。

做完了這些,在提交表單時我們就能在控制臺中看到組件的狀態了!接下來最大的挑戰就是使用EmbarkJS和它的API實現組件與智能合約實例的交互。

1、將數據上傳到IPFS

回想一下我們剛才的定義,DReddit中創建帖子函數createPost()接收一些字節作為帖子的描述,我們也討論了,這些字節實際上并不是帖子自身的數據,而是能夠指向帖子數據的IPFS哈希值。換句話說,我們必須以某種方式將數據上傳到IPFS中,并獲得這樣的哈希值。

Circle將其短期貸款利率從昨天的0.25%降至0%:金色財經報道,分析師Dylan LeClair發推表示,根據Internet Archive數據顯示,在停止從Genesis提款后,USDC的發行商Circle已將其短期貸款利率從昨天的 0.25%降至0%。[2022/11/17 13:17:10]

幸運的是,強大的EmbarkJS為我們提供了大量的API來實現這個功能!就比如說,EmbarkJS的存儲文檔函數EmbarkJS

代碼中我們使用了將JavaScript對象轉換為字符串的函數JSON

asynccomponentDidMount(){constipfsHash=web3

...}

這里需要強調的一點是:在頁面加載時調用數據獲取函數EmbarkJS

);

這也意味著我們的應用程序只會在EmbarkJS準備就緒時執行渲染,展示數據。從理論上來說,這樣做等待的時間可能會變長,但就我們這個DReddit應用程序而言,造成影響的可能性不大。

我們還需要添加帖子所有者和帖子創建日期。按照預期,所有者和創建日期都將作為帖子的屬性被記錄下來。我們只需要以用戶可以理解的方式對數據進行格式化,展示所有者并不會有什么問題,但要以人類可讀的形式展示日期就需要安裝并導入日期格式庫dateformat,安裝的操作如下所示:

npminstall--savedateformat

安裝完成后,我們需要更新帖子組件Post的渲染函數render(),將得到的帖子創建日期creationDate轉換成人類可讀的形式。

動態 | EOS節點競選賬戶總數達到46498個 較昨天增加75個:據引力觀察消息,目前為止,加入投票的EOS達到4.4202億個,相比昨天增加2萬個。中國大陸的8家超級節點分別是:第1名火幣礦池、第2名starteos、第4名eosflytomars、第5名zbeos、第12名EOS cochain、第13名EOS佳能、第16名EOS深圳、第18名EOSBeijing。參與EOS投票的賬戶達到46498個,相比昨天增加75個。EOS賬戶總數達到728268個,相比昨天增加932個。[2019/2/18]

..

當我們添加帖子時,帖子個數posts

render(){return({this

list=awaitPromise

...}

請注意,在上面的代碼中,我們并沒有用await語句來等待每次對帖子的調用。這是故意為之,因為我們不可能等待每一個承諾的完成,所以我們會收集所有需要的承諾,然后使用Promise

);this

到現在為止,我們的DReddit應用程序已經可以展示所有已創建帖子的列表。但遺憾的是,在添加新帖子時,它并不會自動重新加載帖子。因此,我們必須在每次添加帖子后刷新瀏覽器,這樣做十分影響用戶體驗,我們現在需要解決這個問題。

b)重新加載帖子

我們有多種不同的方法來實現帖子列表的重新加載,最簡單的一種就是讓創建帖子組件createPost告訴帖子列表組件List重新加載帖子。但是,我們構建的這個React應用程序并沒有設置通信層,所以最直接的方法就是更改創建帖子組件CreatePost和帖子列表組件List的父組件(在這里就是App組件)中加載帖子的邏輯,讓這個父組件把邏輯傳遞到需要它的地方。這也意味著我們將把獲取帖子列表的功能放在App組件中,帖子列表組件List僅僅接收傳遞過來的純數據。

動態 | 比特幣空頭交易員昨天宣布停止比特幣做空:據ccn消息,前國際貨幣基金組織經濟學家和法羅高級風險交易員 Mark Dow曾于比特幣最高點19,511美元時開始做空,當時他認為比特幣不會維持其增長,價格也會下滑。直到12月18日,Dow在推特上宣布停止比特幣做空,他表示今年已經收獲兩次利潤,現在最終決定停止做空,但他并未評論這是否是因為他看漲。[2018/12/19]

這個實現方法聽起來很繞,但不用擔心,在代碼中實現它并不難!我們首先需要在App組件中定義一個讀取帖子函數loadPosts(),然后基本上我們需要把帖子列表組件List中componentDidMount()函數的所有功能都移動到App組件中:

exportclassAppextendsComponent{..

}list=awaitPromise

);list;this

}

為了完成這項工作,我們還需要引入一個帖子的狀態,這樣就可以確保App組件在掛載時會調用讀取帖子函數loadPosts():

exportclassAppextendsComponent{constructor(props){super(props);this

asynccomponentDidMount(){awaitthis

...}

最后但同樣重要的是,我們需要將帖子傳遞給帖子列表組件List并將加載帖子函數loadPosts()傳遞給創建帖子組件CreatePost作為回調處理程序:

render(){return(DReddit

昨天數字貨幣價格全面下滑 但Ripple繼續創下歷史新高:雖然比特幣,Ethereum和Litecoin等數字資產的價格周四因韓國開始要求實名加密貨幣交易并考慮禁止某些交易所的消息而數字貨幣價格全面下滑,但Ripple繼續創下歷史新高。

比特幣價格大約下跌8%至14,200美元,以太坊下跌4%至725美元,萊特幣下跌11%至240美元。但在同一時期,目前市場價值約為555億美元的瑞波幣(Ripple)在統計所有流通加密貨幣時保持穩定。Ripple今年激增,大約增加了23,900%,成為全球第三大有價值的加密貨幣。[2017/12/29]

完成后,我們可以分別從this

有了這些功能。在新創建帖子時,帖子列表會自動重新加載,你大可去試一試。

添加投票功能

我們將要實現的最后一個功能就是對帖子進行好評還是差評的投票。這需要我們回到剛剛創建的帖子組件Post中進行更改,首先我們必須明確此處更改要實現的功能:

展示每個帖子的好評數和差評數;

為用戶分別添加處理好評投票和差評投票的處理程序;

確定用戶是否可以對帖子進行投票。

a)渲染帖子的票數

第一個功能是其中最瑣碎的一個,所以我們先來進行它的攻關。雖然DReddit智能合約返回的數據中已經附加了好評數和差評數,但它的格式并不正確,因為智能合約返回的數據是字符串形式。接下來我們需要擴展App組件的加載帖子函數loadPosts()來實現對帖子好評數和差評數的解析,代碼如下:

asyncloadPosts(){..

);...}

完成后,我們可以通過帖子列表組件List中的props對象將每個帖子的好評數和差評數傳遞給每個帖子組件Post:

exportclassListextendsComponent{..

我們還希望在成功發送投票后更新視圖。我們需要通過帖子的props對象獲取帖子的好評差評投票并相應地渲染它們。但是,如果在接收到投票后立刻更新這些值就好了。為此,我們需要更改代碼,讓它只讀取一次來自props對象的好評差評投票并將它們存儲在組件的狀態中。

exportclassPostextendsComponent{constructor(props){super(props);this

...}

同時我們還需要更改組件的渲染函數render(),讓它從組件狀態中讀取數據而不是從props對象中:

render(){..

大功告成,我們現在可以對帖子進行好評差評投票,且對每個帖子只能投票一次,沒錯,當我們對一個帖子多次投票時,程序會報錯。這是因為,我們在智能合約中加入了一項限制條件,確保用戶無法對已經投票或還未創建的帖子進行好評差評投票。

成功近在眼前,最后我們只需要將這個投票限制邏輯加入前端程序中。

c)使用函數canVote()禁用投票按鈕

這個投票限制邏輯實現起來非常簡單。如果用戶不能對帖子投票,我們只需要禁用投票按鈕。我們可以通過調用智能合約中能否投票函數canVote()來確定用戶能否進行投票。同時,我們還需要考慮到,如果用戶已經對一個帖子進行了投票,只是這筆包含投票的交易還未被加入到區塊鏈中,也就是說此時投票尚未完成,這時我們不應該允許用戶對該帖子再次投票。

在代碼中,這個功能對應于投票是否正在提交(submitting)的狀態。一般來說,如果一個用戶之前沒有對某個帖子投票,并且他此時沒有在提交對該帖子的投票,那么他就可以對該帖子投票:

exportclassPostextendsComponent{constructor(props){super(props);this

...}

接下來,我們需要更新帖子組件Post的渲染函數render(),以便在用戶不能對帖子投票時禁用投票按鈕:

render(){..

...}

在進行投票時,我們在發送投票所在的交易之前要先將正在提交狀態submitting設置為是(true),并在交易完成后再將其改為否(false),由于此時已經完成了對帖子的投票,因此能否投票狀態canVote也應該被設置為否(false):

asyncvote(ballot){..

Bingo!運行一下代碼看看效果吧!

一些建議

上述所實現的功能只是百度貼吧提供功能的冰山一角,因此,我們還可以在很多地方做出改進和優化,以下是我的一些建議:

按照反向的時間順序對帖子進行排序,以便最新提交的帖子始終位于頁面頂部;

通過智能合約事件實現帖子列表的重新加載;

引入路由,以便不同用戶在創建和查看帖子時有不同的視圖;

使用CSS來美化應用程序的視圖;

通過使用IPFS和智能合約組合開發一款去中心化應用并不是難事,更多功能等你去挖掘喲。

GitHub地址:

https://github.com/embark-framework/dreddit-tutorial

原文地址:

1、SettinguptheprojectandimplementingaSmartContract

https://embark.status.im/news/2019/02/04/building-a-decentralized-reddit-with-embark-part-1/

2、TestingtheSmartContractthroughEmbarkJS

https://embark.status.im/news/2019/02/11/building-a-decentralized-reddit-with-embark-part-2/

3、Buildingasimplefront-endusingReact

https://embark.status.im/news/2019/02/18/building-a-decentralized-reddit-with-embark-part-3/

Tags:OSTPOSPOSTREABOSTPosition TokenPoSTokenDreamPad Capital

BTC
關于SPOR(超級幣)7月25日火熱上線BTB.io公告_SPO

尊敬的BTB.io用戶:BTB.io交易所將于新加坡時間2019年7月25日上線SPOR 上線時間: 開放充值時間:2019年7月10日10:00開放交易時間:2019年7月25日11:00消息.

1900/1/1 0:00:00
最高上漲15455%!2019上半年表現最好和最差的加密貨幣_SOL

文|梁雨山 出品|火星財經APP 盡管年初以來加密貨幣市場總值迅速上升,但許多知名的加密貨幣卻在2019上半年處于下跌通道.

1900/1/1 0:00:00
垃圾分類大全:你手中的垃圾幣該何去何從?_COIN

作者:笑巖 上周一要好高中同學,說女朋友跟他分手,問還有沒有挽回的余地? 我回復道: 沒談過不知道,但我覺得談戀愛跟就炒幣一樣,所有的付出都是要有回報的,腦子正常的人對達不到預期收益的幣.

1900/1/1 0:00:00
Facebook加密計劃在英美兩國再遭質疑_FACE

摘要:自上月社交媒體巨頭Facebook推出加密項目Libra以來,來自各界的評論和質疑聲音不斷。英國金融監管機構的一位高級官員表示Facebook的加密貨幣將給社會和政府帶來問題.

1900/1/1 0:00:00
重申不威脅全球金融穩定 G20對加密行業還做了哪些承諾_UTY

在日本大阪舉行的G20峰會結束之時,二十國集團領導人發布了一項包含加密資產的聲明,他們重申了加密資產不會對全球金融穩定構成威脅,同時還要求制定監管標準的機構繼續深入開展工作.

1900/1/1 0:00:00
美國立法者公開信表達對Libra三大顧忌:隱私、監管和敏感數據_ACE

金色財經比特幣7月3日訊美國立法者們正式給社交網絡巨頭Facebook高管致信,要求他們暫停加密貨幣Libra所有工作.

1900/1/1 0:00:00
ads