1. 程式人生 > >一套程式碼小程式&Web&Native執行的探索(1)

一套程式碼小程式&Web&Native執行的探索(1)

前言

之前一直在跟業務方打交道後面研究了下後端,期間還做了一些運營、管理相關工作,哈哈,最近一年工作經歷十分豐富啊,生命在於不斷的嘗試嘛。

當然,不可避免的在前端技術一塊也稍微有點落後,對React&Vue沒有進行過深入一點的研究,這裡得空我們便來一起研究一番(回想起來寫程式碼的日子才是最快樂的?),因為我們現在也慢慢在切React、想嘗試下React Native,但是我這邊對於到底React還是Vue還是比較疑惑,所以我這裡研究下,順便看看能不能解決小程式一套程式碼的問題

我們現在就來嘗試,是否可以用React或者Vue讓一套程式碼能在三端同時執行

我們這裡依舊使用這個我覺得還算複雜的例子,做一個首頁一個列表頁,後面嘗試將這套程式碼翻譯成React Native以及微信小程式,於是便開始我們這次的學習吧

PS:我這裡對React&Vue熟悉度一般,文中就是demo研究,有不妥的地方請各位指正

React的開發方式

工欲善其事必先利其器,我們這裡依舊先做UI元件,首先我們做一個彈出層提示元件alert,這裡我們儘量嘗試與小程式開發模式保持一致點

我們這裡先來建立一個元件:

12345678910111213141516 classUIAlert  extendsReact.Component{propType(){//name必須有,並且必須是字串name:React.PropTypes.string.isRequired}render(){return(<view>我是{this.props.name}</view>);}};React.render(<UIAlert name="alert"/>,document.getElementById('main'
));
12 //輸出我是alert

生成的HTML結構為:

123 <view data-reactid=".0">  <span data-reactid=".0.0">我是</span><span data-reactid=".0.1">alert</span></view>

這裡view顯然不會被識別,我們簡單做下處理(這裡順便升級下我們React的版本):

123456789101112131415161718 classView extendsReact.Component{render(){return(<div>{this.props.children}</div>);}}classUIAlert extendsReact.Component{render(){return(<View>我是{this.props.name}</View>);}};ReactDOM.render(<UIAlert name="alert"/>,document.getElementById('root'));

於是我們生成了這個樣子的程式碼,沒有額外新增span也沒有新增id標識了:

1 <div id="root"><div>我是alert</div></div>

我們這裡依舊以一個實際的例子來說明React的各種細節,這裡我們索性來做一個提示框元件吧,這裡我們先實現一個遮蓋層:

12345678910111213141516171819 classUIMask extendsReact.Component{constructor(props){super(props);this.state={};this.onClick=this.onClick.bind(this);}onClick(e){if(e.target.dataset.flag!=='mask')return;this.props.onMaskClick();}render(){return(<div onClick={this.onClick}data-flag="mask"className="cm-overlay"style={{zIndex:this.props.uiIndex,display:this.props.isShow}}>{this.props.children}</div>);}}

這裡簡單說下React中狀態以及屬性的區別(我理解下的區別):

12 React中的屬性是隻讀的,原則上部允許修改自己的屬性,他一般作為屬性由父元件傳入state作為元件狀態機而存在,表示元件處於不同的狀態,所以是可變的,state是元件資料基礎

這句話說的好像比較抽象,這裡具體表達一下是:

① 屬性可以從父元件獲取,並且父元件賦值是元件的主要使用方式

② 一個元件內部不會有呼叫setProps類似的方法期望引起屬性的變化

③ 總之屬性便是元件的固有屬性,我們只能像函式一樣使用而不是想去改變

④ 如果你想改變一個屬性的值,那麼說明他該被定義為狀態

⑤ 反之如果一個變數可以從父元件中獲取,那麼他一定不是一個狀態

這裡以我們這裡的遮蓋層元件為例說明:

遮蓋層的z-index以及是否顯示,對於遮蓋層來說就是最小原子單元了,而且他們也是父元件通過屬性的方式傳入的,我們看看這裡提示框的程式碼:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 classUIAlert extendsReact.Component{constructor(props){super(props);this.state={isShow:'',uiIndex:3000,title:'',message:'message',btns:[{type:'ok',name:'確定'},{type:'cancel',name:'取消'}]};this.onMaskClick=this.onMaskClick.bind(this);}onMaskClick(){this.setState({isShow:'none'});}render(){return(<UIMask onMaskClick={this.onMaskClick}uiIndex={this.state.uiIndex}isShow={this.state.isShow}><div className="cm-modal cm-modal--alert"style={{zIndex:this.state.uiIndex+1,display:this.state.isShow}}><div className="cm-modal-bd"><div className="cm-alert-title">{this.state.title}</div>{this.state.message.length>10?<div className="cm-mutil-lines">{this.state.message}</div>:<div>{this.state.message}</div>}</div><div className={this.state.btns.length>2?'cm-actions  cm-actions--full':'cm-actions '}>{this.state.btns.map(function(item){return<span data-type={item.type}className={item.type=='ok'?'cm-btns-ok cm-actions-btn ':'cm-actions-btn cm-btns-cancel'}>{item.name}</span>})}</div></div></UIMask>);}};

為了方便除錯,我們這裡給提示框元件定義了很多“狀態”,而這裡面的狀態可能有很多是“不合適”的,可以看到我們遮蓋層UIMask使用的幾個屬性全部是這裡傳入的,然後我們這裡想象下真實使用場景,肯定是全域性有一個變數,或者按鈕控制顯示隱藏,所以我們這個元件進行一輪改造:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

相關推薦

程式碼程式&Web&Native執行探索02

接上文:一套程式碼小程式&Web&Native執行的探索01,本文都是一些探索性為目的的研究學習,在最終版輸出前,內中的內容可能會有點亂 參考: https://github.com/fastCreator/MVVM https://www.tangshuang.net/3756.htm

程式碼程式&Web&Native執行探索1

前言 之前一直在跟業務方打交道後面研究了下後端,期間還做了一些運營、管理相關工作,哈哈,最近一年工作經歷十分豐富啊,生命在於不斷的嘗試嘛。 當然,不可避免的在前端技術一塊也稍微有點落後,對React&Vue沒有進行過深入一點的研究,這裡得空我們便來一起研究一番(回想起來寫程式碼的日子才是最快樂的

程式碼程式&Web&Native執行探索03

我們在研究如果小程式在多端執行的時候,基本在前端框架這塊陷入了困境,因為市面上沒有框架可以直接拿來用,而Vue的相識度比較高,而且口碑很好,我們便接著這個機會同步學習Vue也解決我們的問題,我們看看這個系列結束後,會不會離目標進一點,後續如果實現後會重新整理系列文章...... 參考: https:/

程式碼程式&Web&Native執行探索2

接上文:一套程式碼小程式&Web&Native執行的探索01,本文都是一些探索性為目的的研究學習,在最終版輸出前,內中的內容可能會有點亂 參考: https://github.com/fastCreator/MVVM https://www.tangshuang.net/3756.html

程式碼程式&Web&Native執行探索04——資料更新

參考: https://github.com/fastCreator/MVVM(極度參考,十分感謝該作者,直接看Vue會比較吃力的,但是看完這個作者的程式碼便會輕易很多,可惜這個作者沒有對應部落格說明,不然就爽了) https://www.tangshuang.net/3756.html htt

程式碼程式&Web&Native執行探索05——snabbdom

參考: https://github.com/fastCreator/MVVM(極度參考,十分感謝該作者,直接看Vue會比較吃力的,但是看完這個作者的程式碼便會輕易很多,可惜這個作者沒有對應部落格說明,不然就爽了) https://www.tangshuang.net/3756.html h

程式碼程式&Web&Native執行探索07——mpvue簡單調研

前言 最近工作比較忙,加之上個月生了小孩,小情人是各種折騰他爸媽,我們可以使用的獨立時間片不多,雖然這塊研究進展緩慢,但是一直做下去,肯定還是會有一些收穫的 之前我們這個課題研究一直是做獨立的研究,沒有去看已有的解決方案,這個是為了保證一個自己獨立的思維,無論獨立的思維還是人格都是很重要的東西,然獨學

程式碼程式&Native&Web階段總結篇】可以這樣閱讀Vue原始碼

前言 在實際程式碼過程中我們發現,我們可能又要做H5站又要做小程式同時還要做個APP,這裡會造成很大的資源浪費,如果設定一個規則,讓我們可以先寫H5程式碼,然後將小程式以及APP的業務差異程式碼做掉,豈不快哉?但小程式的web框架並不開源,不然也用不著我們在此費力了,經過研究,小程式web端框架是一套自

課堂|通過遊戲學習Ethereum DApps程式設計1

這篇文章,是通過製作一款可愛的遊戲(DAPP,也可以稱做智慧合約),從而學習Solidity語言。和ETH網路的一些基礎知識。 全程線上程式設計,無需搭建複雜的環境,只需要有任何其他語言的程式設計經驗,即可馬上學習。 這篇文章是一篇關於製作遊戲的總結。 1

程式學習之路--UI1

button.wxss /* pages/button/button.wxss */ .container{ align-items: flex-start; justify-content:

簡易程式複習C語法基礎1

#include<stdio.h> int main() { printf("Enter a number to sum:\n"); printf("Enter \"0\" if you want to quit.\n"); long su

微信程式-自定義NavBar元件1

最近公司專案忙得不可開交,各種不可描述的事情,然後學習基本停機。這個週末沒出去浪,就在家把之前王夫人給我設計的小程式做了做,然後一步步分享做的過程中遇到的問題和積累,希望大家爬坑過程中能幫到一些吧 元件化 元件化本身是一個可以講的很大,也可以濃縮為

微信程式實現動態新增標籤1

說明:最近入住微信小程式,將自己所學經歷分享出來,包括學到的知識,踩到的坑,一起分享給大家,後續會慢慢更新: 首先針對一些幾乎沒有基礎的童鞋,附上一些連結,大致看完後能夠有能力製作簡單的小程式了: 另外特別推薦一波福利(樣式庫,也就是說,各種

微信程式開發的一些知識點1

應用程式入口下最多有五級頁面,每級頁面可以無限多,但是小程式對整個程式的大小有要求,而且比較小,所以實際開發中,頁面是有限制的。 app.js,app.json,app.wxss配置全域性的,要是在頁面和app中都配置了,則使用就近原則 各頁面.wxml骨架,.wxss樣

建立門新的程式語言-Flex&Bison教程-1-初探

之前一直想鑽研一下這方面的東西,於是便花了一些精力研究這些相關的工具和技術,現在我把我總結的一些經驗分享給大家 Flex & Bison 是比較有名而且易用的parser組合,今後的工作大體都用到了這兩個工具。他們可以在gnu官網下載,windows使用者要麼去下載

.NET Core 程式開發零基礎系列1——開發者啟用並牽手成功

  最近幾個月本人與團隊一直與小程式打交道,對小程式的實戰開發算比較熟悉,也因一些朋友經常問我各種小程式問題,無不能一一回答,想了很久,決定還是空餘時間來寫寫文章吧,偶爾發現一個人安靜的時候寫文章特爽,不信大夥可以試試哦^_^ 一般專案開發已快速為主,這時想到了一個小程式開源框架,盛派Senparc

java web程式啟動自動執行方法spring

場景:將web專案部署到tomcat後,啟動tomcat後自動執行程式重的某個方法。 環境:spring、springmvc 直接新建一個controller類,讓該類實現ApplicationLis

程式picker---級聯效果三級

一、WXML <!-- 部門 --> < picker bindchange = "bindPickerChange1" value =

優勢執行1——把人生當成次探險

你會再來一遍嗎 如果有機會能夠將此前的生活從新經歷一遍,你會願意這麼做嗎? 如果有機會的話,我不會反對從頭開始再活一遍,只是希望能有機會在第二版的時候修正一下第一版的某些錯誤。可問題是,如果沒有機會修改這些錯誤,你又會作何選擇呢? 20世紀初,朱爾思雷納德曾經認真思考過這個問題,他最