zoukankan      html  css  js  c++  java
  • React+Redux项目实战总结

    本项目实战是简化版的大众点评wap版

    技术栈

    react + redux + react-router-dom
    mock数据使用的是 koa + koa-router

    项目源码:https://github.com/volcanoliuc/dianpingapp

    项目结构

    ├── app    #项目主目录
    │ ├── index.jsx    # 项目的入口index
    │ ├── index.tmpl.html    # html生成模板
    │ ├── actions    # redux action
    │ ├── component    # 组件文件夹(木偶组件)
    │ ├── config
    │ ├── contianer    # 组件文件夹(智能组件)
    │ │ ├── index.jsx
    │ │ ├── 404.jsx    # 404页面
    │ │ ├── City    # 选择城市
    │ │ ├── Detail    # 商户详情页
    │ │ ├── Home    # 首页
    │ │ ├── Login    # 登录页
    │ │ ├── Search    # 搜索结果页
    │ │ └── User    # 用户中心页
    │ ├── contant    # actionType
    │ ├── fetch    # 请求服务API
    │ ├── config
    │ ├── reducers
    │ ├── router    #路由配置
    │ ├── static    # 静态文件
    │ ├── store
    │ └── util    # 工具方法
    ├── docs
    ├── mock    # mock数据
    │ ├── server.js
    │ └── ...
    └── test

    遇到的问题及解决方法

    1.react-router-dom 4.0
    路径跳转问题:
    react-router-dom 4.0无法通过导入browserHistory进行跳转

    解决方案一:
    通过react-router-dom history进行跳转:this.props.history.push('/')

    • 配置在Route下的组件可以直接调用this.props.history
    • 未配置在Route下的组件需要用withRouter高阶组件把组件包裹起来
    import {withRouter} from 'react-router-dom'
    ... 
    class App extends React.Component{
      handleClick(){
        this.props.history.push('/')
      }
      ...
    }
    export default withRouter(App)
    

    解决方法二:
    react-router v4 在 Router 组件中通过Context暴露了一个router对象,可以在子组件中使用Context获取router对象,因为react不推荐使用Context,所以这种方法慎用,具体实现自行搜索 - -#

    2.node后端接收post请求参数
    一、koa后端无法直接读取post传过去的参数所以需要定义一个方法去解析post参数。

    //解析传入的post参数
    const parsePostData = ( ctx ) =>  {
      return new Promise((resolve, reject) => {
        try {
          let postdata = "";
          ctx.req.addListener('data', (data) => {
            postdata += data
          })
          ctx.req.addListener("end",function(){
            let parseData = parseQueryStr( postdata )
            resolve( parseData )
          })
        } catch ( err ) {
          reject(err)
        }
      })
    }
    //把传入的参数解析成对象
    const parseQueryStr = ( queryStr ) =>  {
      let queryData = {}
      let queryStrList = queryStr.split('&')
      console.log( queryStrList )
      for (  let [ index, queryStr ] of queryStrList.entries()  ) {
        let itemList = queryStr.split('=')
        queryData[ itemList[0] ] = decodeURIComponent(itemList[1])
      }
      return queryData
    }
    

    只需要把koa ctx 直接传入parsePostData就可以得到一个post请求的参数

    let postData = await parsePostData( ctx )

    二、使用koa-bodyparser中间件
    对于POST请求的处理,koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中

     npm install --save koa-bodyparser@3  //安装
    
    ...
    // 使用ctx.body解析中间件
    app.use(bodyParser())
    ...
    let postData = ctx.request.body
    

    更多关于koa的学习资料可以参考Koa2进阶学习笔记

    总结

    本次项目从零配置整个项目的结构,主要是让自己了重新理解了react + redux + react-router 全家桶开发模式。

  • 相关阅读:
    Array中使用异步函数遍历元素,Array循环同步执行
    vscode设置快捷键"h"快速生成html模板
    IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。
    FTP服务器与客户端的安装与配置
    移动端页面顶部滑动实现菜单的弹出与隐藏
    JS十大经典排序排序算法
    【bug】table重新加载数据,页面滚动条下沉到底部,记录scrollTop后将其恢复scrollTop出现闪烁
    寄生组合式继承
    扁平对象,转为树形对象
    使用CSS禁止textarea调整大小功能的方法
  • 原文地址:https://www.cnblogs.com/voll/p/8057824.html
Copyright © 2011-2022 走看看