摘要:說了這么多還沒說自己做了什么,我做的是仿知乎,目的在于想通過這次學習對小程序有一個更好的認識,這次的學習也是在前輩的鋪墊下進一步的學習,學習到了很多前輩的想法,感覺很不錯。
最近的十幾天中在接觸小程序,從看別人的開源項目,到現(xiàn)在自己做一個項目,整個過程中心情是有起有落,也學到了很多東西,接下來和大家一起分享自己的學習過程,一起交流,一起學習:
選題在做項目的開始,我們首先要做的事就是選擇主題了,無論我們是選擇仿一個項目,還是選擇自己原創(chuàng)一個項目,都要面對選擇主題,對不同層次的學習者來說,主題的選擇的思考不同。對于自己來說,還是一個初入小程序的新人,我就說說我自己現(xiàn)在對選題的看法,作為一個新手,我更多的是偏向選擇一個自己感覺容易上手的項目,例如先仿一個開源項目,熟悉小程序的一些組件、API等,也就是熟悉小程序的一些開發(fā)套路,不要為了做項目而去做項目,要清楚做項目的目的是什么,是學習,還是 完成老板任務(wù),還是為了更多的star等等,這個得自己去思考。
說了這么多還沒說自己做了什么,我做的是仿知乎,目的在于想通過這次學習對小程序有一個更好的認識,這次的學習也是在前輩的鋪墊下進一步的學習,學習到了很多前輩的想法,感覺很不錯。下面我和大家分享整個項目編寫過程我的一些思考,遇到的問題和看法等等。
項目已實現(xiàn)功能:列表式渲染數(shù)據(jù)
上拉刷新
下拉加載更多
頁面跳轉(zhuǎn)
傳參頁面跳轉(zhuǎn)
按鈕點擊彈窗
圖片輪播
頂部導航等等
項目效果:底部tabBar切換
首頁切換
上拉刷新下拉加載
點擊事件及頁面跳轉(zhuǎn)
評論功能
上面是目前項目已經(jīng)實現(xiàn)的部分,其他功能在日后會繼續(xù)實現(xiàn)。
項目的初心在整個項目開始之前,我思考過這個問題,我寫這個項目是為什么,這是自己寫項目的動力,自己現(xiàn)在還處于學習階段,更多的是想通過這個項目自己能夠?qū)W到什么,編程技巧,編程思想,對小程序的熟悉程度等等,所以自己在寫代碼的時候多去用用之前自己沒有接觸過的東西,例如commonJS中的文件引入的方法同時也使用了ES6中模塊化引入的方法等等,很多人可能不理解為什么要這么用,明明可以那樣做。對于一個學習者來說,要盡可能的在一個項目中多用到不同的方法,讓自己知道有這么個東西的存在并學會掌握方便日后的項目中的使用,這才實現(xiàn)了做這個項目的價值。即對現(xiàn)在的我來說,仿知乎這個項目的初心是為了學習更多自己沒有接觸到的東西,讓自己對編程有進一步的了解。
項目介紹項目起步
項目開始的時候我首先思考的問題就是文件排版,一個完整的項目應該對文件有一個合理的結(jié)構(gòu),需要模塊化,增強項目的可讀性,操作和以后維護起來也就更加的方便了。看看自己的文件的目錄:
上面就是自己項目的主要目錄了,按照自己的想法對其分解,但是還是存在著很多的問題,編寫的并不是很好,很多的功能的實現(xiàn)代碼沒有多帶帶的用不同的文件區(qū)分開,都是在一個文件中編寫,這需要進一步的優(yōu)化,模塊化在編程中是一個挺重要的思想,可以很好的實現(xiàn)代碼的重用性,可以節(jié)約一定的開發(fā)時間。最近也在看看前端工作流的一些東西,項目目錄也是分為開發(fā)目錄和上線目錄,可以通過babel、gulp、webpack等對開發(fā)文件的一些處理,也是挺不錯的一種思想,對這了解的還不是很多,還在學習中,以后項目開發(fā)中可以用,增加自己對企業(yè)級開發(fā)的實踐,這也是大家可以學習的一個方向。
后臺數(shù)據(jù)方面
開發(fā)項目中不可缺少的就是數(shù)據(jù)了,現(xiàn)在的項目中的頁面不再可能是靜態(tài)頁面了,把數(shù)據(jù)給寫si了,這沒有任何價值,同時也增加了編程的工作量,代碼也很冗長。這就需要模擬后臺數(shù)據(jù),可以實現(xiàn)列表式渲染數(shù)據(jù),減少了很多的工作量,這就出現(xiàn)了一個問題,怎么模擬后臺數(shù)據(jù),用什么去模仿數(shù)據(jù),很多人會用第三方提供的,例如使用easy-mock,通過wx.request()來獲取數(shù)據(jù),實現(xiàn)頁面加載數(shù)據(jù),相信這種方式大家都會用。如果在本地寫假數(shù)據(jù),那我們又該用什么寫,怎樣獲取數(shù)據(jù),對一個初學者來說應該是不太清楚的(大佬除外),這個就是我們可以學習的地方,學會用不一樣的方式去做一件事,這就會實現(xiàn)做這個項目的目的。
說到這里,數(shù)據(jù)應該是放在js文件中,一般后臺數(shù)據(jù)都是JSON格式,所以放在js文件最為合理了,這時問題又出現(xiàn)了,我們怎么獲取里面的數(shù)據(jù)呢?想到這個我也不曉得怎么獲取里面的數(shù)據(jù),看到前輩有用到require()的方式獲取數(shù)據(jù),想想這個是什么東西,開發(fā)經(jīng)驗不足,不曉得這個是什么東西,自己就會主動的去了解這個是什么東西,原來這個是node中CommonJS中的模塊實現(xiàn),js之前并沒有很好的實現(xiàn)模塊化編程,幾乎所有的代碼都寫在一個文件中,CommonJS的出現(xiàn),實現(xiàn)了JS的模塊化,同時自己也曉得了ES6中也有了屬于自己模塊化的方式了,使用import、export方式實現(xiàn)模塊化編程,感覺自己又學到了,在自己的項目中就都有用到這兩種方式來獲取數(shù)據(jù):
看上面的圖片,就可以看到我兩種方式在一個項目中都是有使用到的,你可能沒有看懂下哦貼出來的是什么,你不需要看懂,現(xiàn)在快去看看CommonJS和ES6中模塊化的知識,你又會學到東西的!!!有人就會不理解,干嘛要在本地寫假數(shù)據(jù)啊,這不在占存儲量嗎,為什么要用兩種模塊化的方式啊,一種不就行了嗎等等問題,其實我做的不是“項目”,我更多的是想通過這個項目我能學到什么東西,這里我知道了兩種模塊化的方式,然后我可以在后面多花點時間對著兩種模塊化方式深入學習,這個就是我想要的結(jié)果,真正的項目開發(fā)中就不要把假數(shù)據(jù)放在本地,也不要一件事情同時使用兩種方式去做,現(xiàn)在可以玩玩,哈哈哈哈哈哈哈!!!!!
引用第三方框架問題
很多人肯定也思考過做項目是否使用第三方框架,還是自己寫原生代碼,這個問題就要看自己的想法了,我就說說我自己的看法,我現(xiàn)在接觸前端的時間不長,很多的東西都不是很清楚,像wxss的樣式想自己去寫,多熟悉樣式屬性,其實讓我用第三方的框架我也不是很會用,但是還是要多去用,要“會”用框架。在這個項目中大部分的wxss文件都是自己寫的,到了后面有的功能的樣式,我也用了第三方框架,像小程序中常用的UI框架中有weui,這個很好用,微信團隊開發(fā)的一個框架,提供了很多的組件,可以減少很多的開發(fā)時間。
我的態(tài)度是,如果是學習的態(tài)度那就自己寫原生代碼這樣提升我認為是比較快的,如果是實際開發(fā)項目,那就是能用框架那就用框架,不要自己造輪子。
項目主要功能實現(xiàn)過程中的思考
小程序開發(fā)模式和我們傳統(tǒng)的開發(fā)模式很不相同,傳統(tǒng)的開發(fā)中我們一般是使用dom操作來動態(tài)的改變頁面,讓我感覺的是一種查找的方式,使用dom操作,找到某個元素然后再改變該元素的行為,從而改變了頁面的狀態(tài),而小程序的開發(fā)模式是MVVM,數(shù)據(jù)綁定頁面,數(shù)據(jù)的改變從而使得頁面狀態(tài)發(fā)生改變,這個傳統(tǒng)的開發(fā)很不相同,這個在小程序開發(fā)很容易踩坑,自己在這個項目中就踩到過這個坑,要理解好MVVM模式。
1.按鈕點擊彈窗事件
屏蔽這個問題 舉報
var util = require("../../utils/util.js");const app = getApp(); Page({ // 頁面初始數(shù)據(jù) data: { // 數(shù)據(jù)源feed: [], // 更多按鈕 觸發(fā)彈窗 showModalStatus: false , }, // 彈窗觸發(fā)事件 powerDrawer: function (e) { // 獲取數(shù)據(jù)源 let feed = this.data.feed; // 得到按鈕點擊時設(shè)置的數(shù)據(jù)值 data-answerId let answer_id = e.currentTarget.dataset.answerid; // 得到按鈕點擊時設(shè)置的數(shù)據(jù)值 data-statu let currentStatu = e.currentTarget.dataset.statu; // 遍歷數(shù)據(jù)源 for(let key of feed) { if(key.answer_id === answer_id){ key.isSelected = true; } } this.setData({ feed:feed, }); // 彈出窗 this.util(currentStatu);} })
//數(shù)據(jù)源模板 var next = { "data": [ { "topic": "教育", "answer_id": 1, ... }, { "topic": "教育", "answer_id": 2, ... }, { ... }, ... ] }
上面就是點擊按鈕彈窗事件的主要代碼,因為做的是列表式數(shù)據(jù)渲染,基本頁面的布局只寫了一個,通過js中的數(shù)據(jù)綁定,可以將數(shù)據(jù)源中的所有的數(shù)據(jù)都可以導入頁面中,這樣可以減少很多的工作量。現(xiàn)在就和大家分享我在寫這個觸發(fā)事件遇到的問題,大家看下面的圖就清楚問題在哪里了:
看到圖就曉得了問題來了,多帶帶點擊一個,其他框也觸發(fā)了彈窗事件,這是做列表式渲染數(shù)據(jù)都容易遇到的問題,遇到的坑,為什么會出現(xiàn)這種問題呢,原因很簡單,因為在寫頁面布局的時候,我們是通過
起初遇到這個問題,我想的辦法是,數(shù)據(jù)源中的數(shù)據(jù)是寫在數(shù)組中,每一數(shù)據(jù)都有自己固定的"answer_id" ,然后我在觸發(fā)彈窗時填入一個數(shù)據(jù)data-answerId="{{item.answer_id}}",設(shè)置的值也為answer_id,我就想通過查找的方式,找到每一個數(shù)據(jù)的answer_id再和觸發(fā)按鈕時的設(shè)置的數(shù)據(jù)進行對比,如果值一樣,就彈出其自身的窗,然而并沒有解決問題,下面是最初設(shè)計的代碼:
這就是想通過查找的方式來解決問題,沒有做到,原因是你每次查找的值和你觸發(fā)時設(shè)置的值都是一樣的,所以是解決不了問題的,這種做法就還停留在傳統(tǒng)的開發(fā)設(shè)計,如dom操作,不斷的查找,找到某個值,然后再改變它。單純的使用這種做法在小程序有些難度來解決問題了,其實要正確的理解MVVM模式,這個問題就很好解決了,數(shù)據(jù)綁定頁面,數(shù)據(jù)改版頁面的狀態(tài)。
解決這個問題的方法就是為每一個數(shù)據(jù)添加一個布爾值,觸發(fā)自身的按鈕事件時其布爾值為true,其他的數(shù)據(jù)的布爾值為false
這樣的寫法就很好的解決了問題,查找操作和數(shù)據(jù)綁定操作一起解決問題。
2.評論功能
評論 {{item.feed_source_name}} {{item.content}} 點贊 {{item.good_num}} 回復{{item.comment_num}} {{item.time}} 發(fā)布
var util = require("../../utils/util.js"); let myComment = ""; Page({ data: { comment: [], content: "", }, onTextChanged: function(e){ //獲取文本框的值,即輸入的評論的內(nèi)容 myComment = e.detail.value; }, onSendClicked: function(e){ //獲取觸發(fā)時設(shè)置數(shù)據(jù)的值 let question_id = e.target.dataset.questionid; var that = this,conArr = []; //定時器,100ms后觸發(fā) setTimeout(function(){ //將評論的基本信息存入數(shù)組 if(myComment.length > 0){ conArr.push({ "feed_source_img": "../../images/icon9.jpeg", "feed_source_name": "zero", "time": util.formatTime(new Date()), "good_num": "0", "comment_num": "0", "content": myComment }) //從數(shù)據(jù)源中獲取評論頁面的所有數(shù)據(jù) var feed = util.getData2(); let comment_data = feed.comment; //找到指定頁面的評論數(shù)據(jù) const comment = comment_data.filter((comment) => { return question_id == comment.question_id;}) //將添加的評論的基本信息數(shù)組conArr合并到數(shù)據(jù)源中評論數(shù)據(jù)的數(shù)組comment[0].ordinaryComment中 var commentContent = comment[0].ordinaryComment.concat(conArr); //將新加入的conArr數(shù)組放在源數(shù)組中的第一位,便于觸發(fā)提交評論時評論內(nèi)容出現(xiàn)在頁面的第一欄 var newCommentContent = commentContent.reverse(); var newComment = comment[0]; comment[0].ordinaryComment = newCommentContent; that.setData({ comment: comment, content: "" }) } },100) }, })
上面就是評論功能的主要代碼,要實現(xiàn)這個功能主要解決的問題是找到指定問題的評論頁面,通過Array.filter()方法可以找到指定問題的評論頁面,然后又解決的問題是將填寫的評論信息加到數(shù)據(jù)源中評論數(shù)據(jù)的數(shù)組comment[0].ordinaryComment中,通過Array.concat()方法可以實現(xiàn),最后就是將新的數(shù)據(jù)展示到頁面上,更新頁面狀態(tài),其中還有一個地方主要注意:如何將輸入的評論信息,顯示在評論欄的第一欄,Array.reverse()可以解決這個問題,這樣就比較好的實現(xiàn)了這個功能。
3.其他功能總結(jié)
像比較常見的功能還有首頁頂部的tab切換,可以使用swiper-item組件和bindtap進行事件綁定,可以實現(xiàn)這種tab切換的效果,下拉刷新的可以使用scroll-view組件,組件里面提供了很多的屬性可以實現(xiàn)很多的功能,還有基本的彈窗功能的組件有wx.showToast()、wx.showActionSheet(OBJECT)、wx.showModal(OBJECT)等等,這些組件都可以看官方文檔學習,學習利用基本組件。
小程序開發(fā)文檔 學會使用開發(fā)文檔,多看開發(fā)文檔,熟悉組件,避免自己不必要的麻煩提供
commonJS學習 比較強的模塊化的學習
ES6模塊化 屬于自己的模塊化開發(fā)
iconfont @font-face 學會使用CSS3 font-size屬性 頁面圖片不再是png格式了,值得學習
weui 學會使用第三方框架,小程序需要學習weui
小程序開發(fā)者工具 小程序開發(fā)工具
結(jié)束這次的學習學到了挺多東西的,要想清除做這個項目的目的是什么,這個項目我的目的就是為了學習,曉得了自己缺少什么,什么需要去加強學習的,在整個項目的完成過程中,其實感覺到了自己的功利心,希望自己快點把項目做完,這個在學習的過程中是很不好的,忘記了自己做項目的初心,作為一個學習者,我們應該多想想做這個項目能給自己帶來什么,我可以通過行動具體的給自己帶來哪些幫助,我們應該要實現(xiàn)這個項目對自己的最大效益,這才是這個項目的存在價值,要對得起這個項目,不要僅僅趨于我做了這個項目,做好了,我不管了,需要不忘初心的學習,做一個有思想的程序猿!!!!!
最后附上這個項目的github地址和個人的聯(lián)系方式,我們可以一起交流學習,共同進步
項目地址:https://github.com/DengSongso...
個人郵箱:DengSongsong1010@163.com
wx: dss1000010
如果覺得這篇文章和項目有好處,歡迎star哦,謝謝大家!!!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90282.html
摘要:說了這么多還沒說自己做了什么,我做的是仿知乎,目的在于想通過這次學習對小程序有一個更好的認識,這次的學習也是在前輩的鋪墊下進一步的學習,學習到了很多前輩的想法,感覺很不錯。 最近的十幾天中在接觸小程序,從看別人的開源項目,到現(xiàn)在自己做一個項目,整個過程中心情是有起有落,也學到了很多東西,接下來和大家一起分享自己的學習過程,一起交流,一起學習: 選題 在做項目的開始,我們首先要做的事就是...
摘要:說了這么多還沒說自己做了什么,我做的是仿知乎,目的在于想通過這次學習對小程序有一個更好的認識,這次的學習也是在前輩的鋪墊下進一步的學習,學習到了很多前輩的想法,感覺很不錯。 最近的十幾天中在接觸小程序,從看別人的開源項目,到現(xiàn)在自己做一個項目,整個過程中心情是有起有落,也學到了很多東西,接下來和大家一起分享自己的學習過程,一起交流,一起學習: 選題 在做項目的開始,我們首先要做的事就是...
摘要:為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習一微信小程序的特點張小龍張小龍全面闡述小程序,推薦通讀此文小程序是一種不需要下載安裝即可使用的應用,它出現(xiàn)了觸手可及的夢想,用戶掃一掃或者搜一下即 為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習; 一:微信小程序的特點 張小龍:張小龍全面闡述小程...
摘要:為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習一微信小程序的特點張小龍張小龍全面闡述小程序,推薦通讀此文小程序是一種不需要下載安裝即可使用的應用,它出現(xiàn)了觸手可及的夢想,用戶掃一掃或者搜一下即 為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習; 一:微信小程序的特點 張小龍:張小龍全面闡述小程...
閱讀 1356·2021-11-22 15:25
閱讀 3350·2021-10-21 09:38
閱讀 1563·2021-10-19 13:21
閱讀 991·2021-09-06 15:00
閱讀 1674·2019-08-30 15:44
閱讀 2576·2019-08-29 15:40
閱讀 3432·2019-08-29 13:44
閱讀 2024·2019-08-26 16:56