react学习笔记--一--移动端项目搭建

一,初始项目搭建

npx create-react-app my-app
cd my-app
npm start

二,项目的目录结构设计

1,新建项目后把src下的东西全删除

react学习笔记--一--移动端项目搭建

2,然后创建相关的目录结构:

react学习笔记--一--移动端项目搭建

三,初始化配置移动端项目文件

1,引入antd-mobile

官网:https://mobile.ant.design/docs/react/introduce-cn
安装:

npm install antd-mobile --save

2,index.html配置移动端参数

<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">

3,移动端300毫秒问题的插件引入

    <script src="https://as.alipayobjects.com/g/component/fastclick/1.0.6/fastclick.js"></script>
    <script>
      if ('addEventListener' in document) {
        document.addEventListener('DOMContentLoaded', function() {
          FastClick.attach(document.body);
        }, false);
      }
      if(!window.Promise) {
        document.writeln('<script src="https://as.alipayobjects.com/g/component/es6-promise/3.2.2/es6-promise.min.js"'+'>'+'<'+'/'+'script>');
      }
    </script>

4,实现antd组件的按需打包(使用到哪个组件了,才会打包编译这个组件)

参看文章:https://blog.csdn.net/zwkkkk1/article/details/88823366
具体介绍可以看下官方手册
(1)引入 react-app-rewired 并修改 package.json 里的启动配置。由于新的 react-app-rewired@2.x 版本的关系,你需要还需要安装 customize-cra。

npm install react-app-rewired customize-cra --save-dev

修改package的配置:

/* package.json */
"scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test --env=jsdom",
+   "test": "react-app-rewired test --env=jsdom",
}

(2)然后在项目根目录创建一个 config-overrides.js 用于修改默认配置。

module.exports = function override(config, env) {
  // do stuff with the webpack config...
  return config;
};

(3)使用 babel-plugin-import, babel-plugin-import 是一个用于按需加载组件代码和样式的 babel 插件(原理),现在我们尝试安装它并修改 config-overrides.js 文件。

npm install babel-plugin-import --save-dev
+ const { override, fixBabelImports } = require('customize-cra');

- module.exports = function override(config, env) {
-   // do stuff with the webpack config...
-   return config;
- };
+ module.exports = override(
+   fixBabelImports('import', {
+     libraryName: 'antd-mobile',
+     style: 'css',
+   }),
+ );

于是就可以在下一步使用了:

四,在应用中使用antd组件

1,入口文件:

import React from 'react'
import ReactDOM from 'react-dom'
import {Button} from 'antd-mobile'
ReactDOM.render(<Button type="primary">Test</Button>,document.getElementById('root'))

然后npm run start
react学习笔记--一--移动端项目搭建

2,安装less,为了修改antd-mobile的默认样式

npm install --save-dev babel-plugin-import less less-loader style-loader css-loader

值得注意的是,目前less-loader只支持到@6.0.0,高于6版本的,会报这个错:
react学习笔记--一--移动端项目搭建
所以这里的less-loader最好指定一下版本,我用的5.0.0
主题定制的官网:https://mobile.ant.design/docs/react/customize-theme-cn
主题样式文件:https://github.com/ant-design/ant-design-mobile/blob/master/components/style/themes/default.less
定制主题,也是在config-overrides.js文件进行更改:

const { override, fixBabelImports , addLessLoader } = require('customize-cra')
const theme = require('./antd-theme.json')
 
module.exports = override(
    addLessLoader({
      javascriptEnabled: true,
      modifyVars: theme,
    }),
    fixBabelImports('import', {
      libraryName: 'antd-mobile',
      libraryDirectory: 'es',
      style: true,
    }),
);

样式文件antd-theme.json新建在根目录下:

{
    "brand-primary": "#000000",
    "brand-primary-tap": "#ffccbc"
}

使用addLessLoader插入less-loader,修改style为true,确保加载less文件。
然后重启项目,样式文件就生效了:
react学习笔记--一--移动端项目搭建

五,引入路由

1,下载路由依赖包react-router-dom:

官方文档:https://reactrouter.com/web/guides/quick-start

npm install --save react-router-dom

2,新建三个页面组件

react学习笔记--一--移动端项目搭建

3,在入口文件index中映射路由和文件

react学习笔记--一--移动端项目搭建

六,引入redux

1,安装下载相关的包

npm install --save redux@3.7.2 react-redux redux-thunk
npm install --save-dev redux-devtools-extension

2,创建多个仓库,然后合并起来

react学习笔记--一--移动端项目搭建

3,在项目中使用并指定仓库

react学习笔记--一--移动端项目搭建

七,创建登陆和注册组件

1,登陆

// 用户登陆的路由组件

import React from 'react'
import {
    NavBar,
    WingBlank,
    List,
    InputItem,
    WhiteSpace,
    Button
} from 'antd-mobile'
import Logo from '../../components/logo/logo'
export default class Login extends React.Component{
    state={
        username:'',
        password:''
    }
    //处理输入框的变化,收集数据到state
    handleChange(name,value){
       this.setState({[name]:value})
    }
    //跳转到注册路由
    toRegister=()=>{
        this.props.history.replace('/register')
    }
    //登陆
    login=()=>{
        console.log(this.state)
    }
    render(){
        return (
            <div>
                <NavBar>硅谷直聘</NavBar>
                <Logo></Logo>
                <WingBlank>
                    <List>
                        <InputItem placeholder="输入用户名" onChange={val=>this.handleChange('username',val)}>
                            用户名:
                        </InputItem>
                        <WhiteSpace></WhiteSpace>
                        <InputItem type='password' placeholder="输入密码" onChange={val=>this.handleChange('password',val)}>
                            密&nbsp;&nbsp;&nbsp;码
                        </InputItem>
                        <WhiteSpace></WhiteSpace>
                        <Button type="primary" onClick={this.Login}>登&nbsp;&nbsp;&nbsp;陆</Button>
                        <WhiteSpace></WhiteSpace>
                        <Button  onClick={this.toRegister}>还没有账号</Button>
                    </List>
                </WingBlank>
            </div>
        )
    }
}

2,注册

/*
    用户注册的路由组件
*/
import React from 'react'
import { NavBar, WingBlank, List, InputItem, WhiteSpace, Radio, Button } from 'antd-mobile'
import Logo from '../../components/logo/logo'

export default class Register extends React.Component {
	state = {
		username: '',
		password: '',
		passwors2: '',
		type: 'dashen',
	}
	//处理输入框/单选框的变化,收集数据到state
	handleChange = (name, value) => {
		this.setState({ [name]: value })
	}
	//跳转到login路由
	toLogin = () => {
		this.props.history.replace('/login')
	}
	//注册
	register = () => {
		console.log(JSON.stringify(this.state))
	}
	render() {
		const { type } = this.state
		return (
			<div>
				<NavBar>硅谷直聘</NavBar>
                <Logo/>
                <WingBlank>
                    <List>
                        <InputItem placeholder="输入用户名" onChange={val=>this.handleChange('username',val)}>
                            用户名:
                        </InputItem>
                        <WhiteSpace></WhiteSpace>
                        <InputItem placeholder="输入密码" type="password" onChange={val=>this.handleChange('password',val)}>
                            密&nbsp;&nbsp;&nbsp;码:
                        </InputItem>
                        <WhiteSpace></WhiteSpace>
                        <InputItem placeholder="输入确认密码" type="password" onChange={val=>this.handleChange('password2',val)}>
                            确认密码
                        </InputItem>
                        <WhiteSpace></WhiteSpace>
                        <List.Item>
                            <span style={{marginRight:30}}>用户类型</span>
                            <Radio checked={this.state.type==='dashen'} onClick={()=>{this.handleChange('type','dashen')}}>大神</Radio>
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <Radio checked={this.state.type==='laoban'} onClick={()=>{this.handleChange('type','laoban')}}>老板</Radio>
                        </List.Item>
                        <WhiteSpace></WhiteSpace>
                        <Button type='primary' onClick={this.register}>注&nbsp;&nbsp;&nbsp;册</Button>
                        <WhiteSpace></WhiteSpace>
                        <Button onClick={this.toLogin}>已经有账号</Button>
                    </List>
                </WingBlank>
			</div>
		)
	}
}

八,封装axios

npm install --save axios
上一篇:软件工程导论第六版 张海藩


下一篇:C# 关键字extern用法