Bone的使用很簡單,上手也很快。如果你想用react搭建一個專案,不妨跟著我試試使用Bone。
Bone特性概述
- 整合了路由(基於 history.js + react-router),並支援前進、後退狀態快取
- 使 Component 支援繫結 Model,實現了邏輯與元件分離
- 提供了靈活的擴充套件機制( store 可動態修改 reducer 和 middleware )
- 針對常見開發場景的功能抽象(如 Layout、SSR 等)
安裝
-
首先需要安裝node.js,並且版本要在8.9 LTS 以上
-
安裝bnpm包管理工具
bnpm 是Bone應用開發方案的包管理工具,用來安裝工具和模組,執行:
npm install -g bnpm --registry=https://npm.aliplus.com/api
複製程式碼
- 登入bnpm,執行
bnpm login
複製程式碼
訪問 https://bone.aliyun.com/profile ,使用頁面上的使用者名稱密碼在命令列上登入
-
最後安裝bone-cli 工具
bone-cli 是 Bone 提供的本地命令列工具,用來完成專案建立、本地開發和專案打包等功能。執行
bnpm install -g @bone/bone-cli 複製程式碼
OK,這樣Bone就安裝成功了。
建立一個專案
現在我們可以用Bone建立一個專案了,輸入
mkdir 專案名
cd 專案名
bone init
複製程式碼
我們可以快速建立一個專案,bone start啟動這個專案。專案建立成功後,你會看到3個主要的檔案分別是app.js,index.html,index.js。app.js可以認為是一個配置路由的地方,index.html就是頁面了,而index.js是提供頁面元件的檔案。通過index.js匯出一個元件,然後由app.js引入,通過路由顯示出來。
Bone擴充套件了React.Component 的功能,你可以在Component中的生命週期函式和方法中通過this訪問以下屬性。
-
navigation
提供路由導航功能。通過this.navigation.push(path,[state])可以跳轉到新的路徑並且傳遞引數。
-
location
當前的路由資訊,通過this.location.pathname可以得到當前路徑名。this.location.state可以獲取navigation傳遞過來的引數。
-
layout
指向當前頁的 Layout 例項。通過layout,我們可以實現一些公共元件例如header,footer的重複使用。只需要在app.js中配置layout,這樣每個頁面都能使用它了。舉個例子我們有一個導航欄元件叫 MyLayout,你只需在app.js中配置
export default createApp({ appName: "test", layout: MyLayout, router: { routes: [{ }], notFound: NotFound } }) 複製程式碼
這樣你所有的頁面都會有這個導航欄了。
-
Model
在這裡著重介紹的是Component 的Model屬性,前面Bone的特性中也提到了Model的作用:實現了邏輯與元件的分離。每個元件都可以繫結一個Model,元件可以通過 this.props.xxx 訪問 Model 的 state,通過this.actions.xxx 呼叫 Model 的 action。在下面的例子中,你可以看到Model是如何讓邏輯與元件分離的。
首先我們先看一個未分離的例子
class Demo extends Component { constructor(props) { super(props); this.state = { number : 0 }; } add= ()=> { this.setState({ number: this.state.number+ 1}); } render(){ return <div className={ style.container }> <h1 className={ style.title }>{this.state.number}</h1> <Button type="normal" onClick={ this.add }>新增</Button> </div> } } 複製程式碼
很好理解,就是每次點選一次新增按鈕,頁面上的數字就加1。這個元件邏輯和元件是未分離的。下面再看分離後是什麼樣子
//元件 demo.js
//引入Model
import DemoModel from "./demoModel"
class Demo extends Component {
static Model = DemoModel;
render(){
return <div className={ style.container }>
<h1 className={ style.title }>{this.props.number}</h1>
<Button type="normal" onClick={ this.actions.add }>新增</Button>
</div>
}
}
//Model demoModel.js
export default class DemoModel extends Model {
// 初始狀態
static initialState = {
number : 0
}
add() {
return { number: this.state.number+ 1 }
}
}
複製程式碼
分離後元件和邏輯分別寫在2個檔案中,元件通過 this.props.number 訪問 Model 的state,通過this.actions.add 呼叫 Model 的 add方法。因為這個例子非常簡單,還看不出分離邏輯和元件的好處,但是當你的專案非常複雜的時候,分離的好處就可以提現出來了。
其實Bone框架的好處還有很多,它提供了一套很方便全面的UI庫。我用Bone寫了一個很簡單的demo,上面的程式碼demo中也有,有興趣的同學可以下載執行一下看看。附上下載地址 github.com/leslie233/B…