Node.js实现PC端类微信聊天软件(三)

Github StackChat

Redux学习回顾

Redux的主要功能就是管理复杂交错的State,比如需要讲state提升到顶层组件的场景中,使用Redux就很合适

Redux主要提供三个东西来进行状态管理

1. Action

表达要进行的动作,也就是通过view层触发,来进行派发来改变全局state

action创建函数

也就是只返回一个action的函数

export const SignUpEmailChange = (value) => ({
  type: 'SIGNUP_EMAIL_CHANGE',
  value: value,
})

action通常有一个type来进行判断要进行的动作,和任意其它的字段

2. Reducer

主要进行接收action根据其中的type来进行更改state

const registerChange = (state, action) => {
  if (typeof state === 'undefined') {
    return initialState
  } else if(action.type === 'SIGNUP_NAME_CHANGE') {
    return Object.assign({}, state, {
      signUpForm: {
        signup: true,
        signupUsername: action.value,
        signupEmail: state.signUpForm.signupEmail,
        signupPwd: state.signUpForm.signupPwd,
      },
    })
  }
...
}

Reducer拆分

当reducer膨胀时还可以进行拆分再用Redux提供的combineReducers进行组合

const Reducer = combineReducers({
  ChatBar,
  Message,
})

3. Store

Store作为全局的state

使用createStore来创建Store

const store = createStore(
  Reducer,
  Initialize,
  applyMiddleware(thunk)
);

第二个第三个参数都是可选的,第一个参数就是进行执行动作的Reducer,第二个是初始化state,第三个为中间件

通过Provider组件来进行分发组件

<Provider store={store}>
    <Router history={browserHistory}>
      <Route path="/" component={App}>
        <IndexRoute component={Login} />
        <Route path="/home" component={MainPanel} />
      </Route>
    </Router>
  </Provider>

dispatch函数

store通过提供dispatch函数来对action的派发,流程也就是

view -> action -> reducer -> store -> view

dispatch接收一个action创建函数

dispatch(onSignup())

React-Redux

Redux的一个React绑定库

主要提供的是connect把组件包装成容器

const Login = connect(
  mapStateToProps,
  mapDispatchToProps
)(SigninCmpt);

接收两个函数参数

mapStateToProps

主要负责把store映射到组件的props上

const mapStateToProps = (state) => ({
  signup: state.signup,
})

mapDispatchToProps

一样是负责映射,把分发函数映射到组件的props上

const mapDispatchToProps = (dispatch) => ({
  onSignup: () => {
    dispatch(onSignup())
  },
  closeSignup: () => {
    dispatch(closeSignup())
  }
})

Redux-thunk

一个action异步处理库,主要功能是能够接收一个返回函数的action创建函数

const fetchSignUp = (username, email, password) => {
  const url = 'http://localhost:8008/api/signup';
  const data = {
    username: username,
    email: email,
    password: password,
  };
  console.log('fetch', data)
  return fetch(url, {
    method: 'POST', // or 'PUT'
    body: JSON.stringify(data), // data can be `string` or {object}!
    headers: new Headers({
      'Content-Type': 'application/json'
    })
  }).then(res => res.json())
  .then(response => console.log('Success:', response));
}

export const SignUpUser = () => {
  return (dispatch, getState) => {
    // TODO fix parameters
    fetchSignUp(getState().signUpForm.signupUsername, getState().signUpForm.signupEmail, getState().signUpForm.signupPwd)
    .then(res => {
      dispatch({
        type: 'SIGNUP_USER',
        sign: false,
      })
    })
  }
}

thunk的在于能够将异步执行逻辑内聚在action中,其中实现利用的是Redux的中间件

MongoDB学习回顾

数据库类型

作为有别于关系型数据库的文档型数据库,其中集合对应于表,行对应与文档,列对应于字段

主要应用场景

  • 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储.方便查询、更新- 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
  • 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
  • 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
  • 视频直播,使用 MongoDB 存储用户信息、礼物信息等

安装驱动包 && 看文档

今日完成

今天主要完成的就是在注册窗口的信息录入状态更改和到后台的验证录入响应

  1. 注册输入框的状态onChange进行接收action派发更改state更新每个输入框的内容
  2. 发送注册请求,利用redux-thunk先进行服务器请求,再进行dispatch
  3. 服务器端的接收请求和数据库的添加
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("stackchat");
    dbo.collection("user").insertOne(user, function(err, res) {
        if (err) throw err;
        console.log("insert success");
    });
  });
}

原文地址:https://www.cnblogs.com/secoding/p/11122979.html

时间: 2024-10-09 21:23:41

Node.js实现PC端类微信聊天软件(三)的相关文章

Node.js实现PC端类微信聊天软件(四)

Github StackChat 学习回顾 React和Electron结合 TypeError: fs.existsSync is not a function 在React组件里引入electron时候就会报这个错,主要原因是在React里不能引入Node.js的模块 解决方法 Webpack target属性 先展开Create-React-App所有配置 npm run eject 在webpack.config.js下添加配置 // other configs... module.ex

Node.js实现PC端类微信聊天软件(一)

Github StackChat 技术栈 写这个软件StackChat的主要目的是巩固练习Node和对React的实践,也是为了学习东西,所以选用了这些自己还没在项目里使用过的技术,边学变写 Electron React Material-UI React-Router Redux Express Socket.io MongoDB 现在已完成前端大部分界面的构建(无状态),所以记录一下 环境搭建 Create-React-App 利用React脚手架Create-React-App,再写入依赖

Node.js实现PC端类微信聊天软件(二)

Github StackChat 用到的React-Router React-Router是React路由的解决方案之一,也可以使用别的库 安装 npm install react-router --save-dev 路由配置 react-router主要提供了几个组件来进行路由之间结构的组织 Router 所有路由组件的根 Route 路由组件 path属性 匹配路径 component属性 匹配路径渲染的组件 IndexRoute 配置默认页面 component 渲染的组件 React.r

Node.js系列:Buffer类的使用

客户端JavaScript中没有对二进制数据提供很好的支持.但是在处理TCP流或文件流时,必须要处理二进制数据.Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区. Buffer中存的数据默认为16进制. 1.创建Buffer对象 在Node.js中,Buffer类是一个可以在任何模块中不使用的全局类,不要单独加载.可以使用New关键字来创建该类的实例对象. Buffer类有三种形式的构造函数: 第一种:将缓存区大小(以字节为单位)作为构造函数的参数 var size

react网页版聊天|仿微信、微博web版|react+pc端仿微信实例

一.项目介绍 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+nodejs等技术混合开发的仿微信web端聊天室reactWebChat项目,实现了聊天记录右键菜单.发送消息.表情(动图),图片.视频预览,浏览器截图粘贴发送等功能. 二.技术选型 MVVM框架:react / react-dom 状态管理:redux / react-redux 页面路由:react-router-dom 弹窗插件:wcPop 打包工具

基于Node.js + socket.io实现WebSocket的聊天DEMO

原文摘自我的前端博客,欢迎大家来访问 http://hacke2.github.io 简介 最近看Node.js和HTML5,练手了一个简易版的聊天DEMO,娱乐一下 为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一, 为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验, 于是socket.io诞生. 简答来说socket.io具体以下特点: 1.socket.io设计的目标是支持任何的浏览器

WebSocket+node.js创建即时通信的Web聊天服务器

1.使用nodejs-websocket nodejs-websocket是基于node.js编写的一个后端实现websocket协议的库, 连接:https://github.com/sitegui/nodejs-websocket. (1)安装 在项目目录下通过npm安装:npm install nodejs-websocket (2)创建服务器 //引入nodejs-websocket var ws = require("nodejs-websocket"); //调用creat

js实现PC端与客户端自适应

我们可以通过js来判断页面对象进行显示, 在外部引入css设定ID 1 <link rel="stylesheet" id="css" type="text/css" href="css/pc.css"/> js代码如下 var newDoc=document.open("text/html","replace"); //重新加载引入 window.onload=functi

js判断PC端还是手机端

if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { window.location.href = "手机版网址"; } else { window.location.href = "PC端网址"; }   原文地址:https://www.cnblogs.com/go-wandering/p/8658566.html