react+react-router+mobx+axios+less 搭建一个框架

之前做过react项目,但是没有全面搭过框架,顺便研究一波mobx。
项目代码github地址:https://github.com/lingziyb/react-mobx-demo

一、选react脚手架

  • 想:自己搭整个框架还是比较费劲的,所以首先想到用它的脚手架来初始化一个大概的框架结构。
  • 搜:开始搜脚手架,最出名的就是facebook官方出版的create-react-app,那我们就用这个。

二、使用create-react-app初始化项目

工具会帮你初始化一个简单基本的项目并且会自动帮你安装项目所需要的各种依赖

  npx create-react-app my-app
  cd my-app
  yarn start   //或者npm start

此时浏览器会自动访问 http://localhost:3000/,你会看到一个 react 的欢迎界面,如下:代表你的项目已经正常运行了。

运行后的页面.png

三、配置项

1. 展开配置项

配置项打开前.png

虽然项目已经运行,但是在项目目录里是找不到webpack配置项的。比如,我们想配置less、配置alias别名,这时我们需要做一个操作:展开项目(eject)[ 注:这个一个不可逆过程,一旦你执行了,就不能回到初始化 ] 。

  yarn eject   // 或者 npm run eject

再看项目结构,此时已多了一些其他目录,展开config目录,里面就有webpack配置文件以及其他各种配置,如下:

配置项打开后.png

2. less配置

  yarn add less less-loader 
修改 webpack配置文件
  • 找到 webpack.config.dev.jswebpack.config.prod.js 文件,后缀 dev 表示开发的配置,prod 表示是生产环境的配置,因此两个配置文件都需要修改。
  • 修改webpack.config.dev.js,在modulerules字段中更改以下代码
    更改前:
{
    test: /\.css$/,
    use: [
        require.resolve( 'style-loader' ),
        {
            loader: require.resolve( 'css-loader' ),
            options: {
            importLoaders: 1,
        },
        ...
    ],              
},

更改后:

{
    test: /\.(css|less)$/,    // 划重点
    use: [
        require.resolve( 'style-loader' ),
        {
            loader: require.resolve( 'css-loader' ),
            options: {
            importLoaders: 1,
        },
        ...
        {
            loader: require.resolve( 'less-loader' ),    // 划重点
        }
    ],              
},
  • 修改webpack.config.prod.js ,同理,在rules字段中更改以上代码

四、引入路由

1. 更改src目录结构

  • 便于更符合实际项目场景,我们在src下新建如下几个文件夹:
    a. api文件夹存放ajax请求
    b. components文件夹存放组件
    c. pages文件夹存放页面
    d. routes文件夹存放路由
    e. stores文件夹存放数据
    f. utils文件夹存放工具类函数

2. 设置文件别名

既然有了文件夹来区分不同的功能,为了方便文件的相互,我们可以利用 webpack 来设置别名。

  • 修改config文件夹下的paths文件
module.exports = {
  ...
  appApi: resolveApp( 'src/api' ),
  appComponents: resolveApp('src/components'),
  appPages: resolveApp( 'src/pages' ),
  appRoutes: resolveApp('src/routes'),
  appStores: resolveApp( 'src/stores' ),
  appUtils: resolveApp('src/utils'),
  ...
  • 修改 webpack 配置项 alias
alias: {
  ...
  api: paths.appApi,
  components: paths.appComponents,
  pages: paths.appPages,
  routes: paths.appRoutes,
  stores: paths.appStores,
  utils: paths.appUtils,
  ...

3. 安装路由组件 react-router

  yarn add react-router react-router-dom
  • pages文件夹中新建home.jsx页面和about.jsx页面
    home.jsx
import React from 'react';
import { Link } from 'react-router-dom';

class Home extends React.Component {
    render() {
        return (
            <div>
                <p>这是首页</p>
                <Link to="/about">go to About</Link>
            </div>
        );
    }
}

export default Home;

about.jsx

import React from 'react'
import { Link } from 'react-router-dom'

class About extends React.Component {
    render() {
        return (
            <div>
                <p>这是about页面</p>
                <Link to="/">go to Home</Link>
            </div>
        )
    }
}

export default About;
  • routes文件夹中新建index.jsx页面
import React from 'react'
import { BrowserRouter as Router, Route } from 'react-router-dom'

import Home from 'pages/home';
import About from 'pages/about';

const Routes = () => (
    <Router>
        <div>
            <Route exact path="/" component={Home}/>
            <Route path="/about" component={About}/>
        </div>
    </Router>
)

export default Routes;
  • 为了页面好看一点点,我们写个App.less
.app {
    text-align: center;
    border: 1px solid #ddd;
    padding: 30px;
    p {
        color: green;
    }
}
  • 更改app.js文件
import React, { Component } from 'react';
import Routes from 'routes/index';
import './App.less'

class App extends Component {
    render() {
        return (
            <div className="app">
                <Routes />
            </div>
        );
    }
}

export default App;

此时首页长相:

首页.png

此时about页长相:

about页

五、添加数据管理mobx

1. 按照依赖

yarn add mobx mobx-react

2.开始使用

  • 使用 mobx 你还需要安装 babel 的装饰器插件,以及修改 babel 的配置
  yarn add babel-plugin-transform-decorators-legacy
  • 修改 package.json 文件中的 babel 参数,或者在根目录下新建一个 .babelrc 文件
"babel": {
  "presets": [
    "react-app"
  ],
  "plugins": [
    "babel-plugin-transform-decorators-legacy"
  ]
...

现在,你可以在你的组件中使用 mobx 来管理你的状态了。关于 mobx 的使用,你可以访问官方文档

3. 修改文件

  • stores里新建index.jshome.jsabout.js。 【 注:home.js和about.js我用了两种方式写,都可以的。】
    home.js
import { observable } from 'mobx';

const HomeStore = observable( {
    title: 'this is home page'
} );

export default HomeStore;

about.js

import { observable } from 'mobx';

class AboutStore {
    @observable title = 'this is about page';
}

export default new AboutStore();

index.js

import aboutStore from './about';
import homeStore from './home';

const store = {
    aboutStore,
    homeStore
};

export default store;
  • 修改app.js
import React, { Component } from 'react';
import Routes from 'routes/index';
import './App.less';
import { Provider } from 'mobx-react';
import stores from 'stores/index';

class App extends Component {
    render() {
        return (
            <div className="app">
                <Provider {...stores}>
                    <Routes />
                </Provider>
            </div>
        );
    }
}

export default App;
  • 修改pages里的home.jsx
import React from 'react';
import { Link } from 'react-router-dom';
import { inject } from 'mobx-react';

@inject( 'homeStore' )
class Home extends React.Component {
    render() {
        return (
            <div>
                <p>{this.props.homeStore.title}</p>
                <Link to="/about">go to About</Link>
            </div>
        );
    }
}

export default Home;
  • 修改pages里的about.jsx
import React from 'react'
import { Link } from 'react-router-dom'
import { inject } from 'mobx-react';

@inject( 'aboutStore' )
class About extends React.Component {
    render() {
        return (
            <div>
                <p>{ this.props.aboutStore.title }</p>
                <Link to="/">goto Home</Link>
            </div>
        )
    }
}

export default About;

这是现在的首页:【数据变了哟】

首页.png

这是现在的about页:【数据变了哟】

about页.png

六、数据请求axios

  yarn add axios
  • api文件夹里增加home.js
import axios from 'axios';

export default {

    /**
     * 获取首页列表页数据
     * @returns {Promise.<*>}
     */
    async getList(){
        return await axios.get( 'http://lemonof.com:82/api/getList' ).then( ( res ) => res.data.data );
    }
}
  • 更改stores里的home.js
import { observable, action } from 'mobx';
import HomeApi from 'api/home';

const HomeStore = observable( {
    title: 'this is home page',
    list: [],

    // 获取首页数据
    async getList() {
        this.list = await HomeApi.getList();
    }
} );

export default HomeStore;
  • 更改pages里的home.jsx
import React from 'react';
import { Link } from 'react-router-dom';
import { observer, inject } from 'mobx-react';

@inject( 'homeStore' )
@observer
class Home extends React.Component {

    componentDidMount() {
        this.props.homeStore.getList();
    }

    render() {
        return (
            <div>
                <p>{this.props.homeStore.title}</p>
                <Link to="/about">go to About</Link>

                <div style={{ textAlign: 'left', width: '450px', margin: 'auto' }}>
                    <p>下面是列表数据:</p>
                    {
                        this.props.homeStore.list && this.props.homeStore.list.map( ( el ) => {
                            return ( <div key={el.id}>标题:{el.title}</div> )
                        } )
                    }
                </div>
            </div>
        );
    }
}

export default Home;

此时首页长相:【页面没有优化,请将就看】

首页.png

此时about页长相:【页面没有优化,请将就看】

about页.png

哇!终于写完了。
后续我再把UI优化下。
最终项目代码地址:https://github.com/lingziyb/react-mobx-demo

查阅文章有:
create-react-app全家桶router+mobx:https://www.jianshu.com/p/2d54c2b3cfa3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容