本系列教程是教大家如何根据开源js绘图库,打造一个属于自己的在线绘图软件。当然,也可以看着是这个绘图库的开发教程。如果你觉得好,欢迎点个赞,让我们更有动力去做好!

本系列教程重点介绍如何开发自己的绘图软件,因此,react基础和框架不在此介绍。可以推荐react官网学习,或《React全家桶免费视频》。

本系列教程源码地址:Github

前面教程一,搭建了一个基础框架,现在我们来实现顶部导航菜单栏功能。

一、react组件间通信 - 菜单事件

这里,我们通过redux方式来实现组件间消息通信。UmiJS做了一点封装,使用更简单。

1. 新建store - model

我们在src/models文件夹下新建event.ts文件,专门用于消息事件的store处理。 主要包含:

  • namespace - 命名空间
  • state - 数据
  • reducers - 数据搬运工

给没有接触过redux的同学简单介绍下,会的请自动跳过: models是数据存储的地方。用namespace来进行模块划分或避免命名冲突;state:类似于react的state,专门用于存放数据;reducers:接收更新命令,根据命令参数(state :原数据;action:新行为参数数据),然后加上自己的业务逻辑,去实现如何更新数据。比如下面,只是简单的赋值,没有额外的业务逻辑。 注意,有个硬性规定就是,reducers要返回一个新数据副本,而不是直接修改models里面的state。因此,这里return下面的第一行(...state)就是先拷贝原始state所有属性,然后第二、三行,赋值新数据。

reducers: {
emit(state, action) {
return {
...state,
event: action.payload.event,
data: action.payload.data,
};
},
},
复制代码

2. 在onMenuClick里,用dispatch发送修改数据命令

UmiJs + DvaJS已经自动封装dispatch到react的props里了,我们直接拿来使用。 目前为止,我们的菜单事件很简单,没有额外数据,我们就直接dispatch发生菜单命令(key值)就好。 其中,type表示在store的所有reducers(不仅仅是上面的model,还包含其他所有model)中查找用哪个函数处理数据,格式:命名空间(event)/reducers函数(emit)。payload,更新数据用的参数。

this.props.dispatch({
type: 'event/emit',
payload: {
event: key
}
});
复制代码

3. 在需要接收菜单消息的page页面,connect连接绑定数据

  1. 导入连接函数:import { connect } from 'dva';
  2. 绑定connect:在pages/index.tsx底部添加:
export default connect((state: any) => ({ event: state.event }))(Index);
复制代码

上面,state:any是指整个store,我们这里暂时只用到event,故只返回event加入到pages/index的props。

4. 在page页面componentDidUpdate,接收消息

componentDidUpdate() {
if (this.props.event !== this.state.event) {
this.setState({ event: this.props.event });
if (this['handle_' + this.props.event.event]) {
this['handle_' + this.props.event.event](this.props.event.data);
}
}
}
复制代码

我们先判断消息是否已经处理过,避免无限循环。然后交给具体函数处理。

5. 最后,画布接口参考开发文档

www.yuque.com/alsmile/top…

二、react组件间通信 - 右上角状态栏

1. 新建store - model

还是先新建一个store用于通信,src/models/canvas.data.ts。这个model用于全局canvas的数据保存。

2. 监听画布canvas消息,dispatch最新状态

在src/pages/index.ts里,前面已经设置监听了canvas的消息onMessage函数。 现在我们添加‘resize’,‘scale’,‘locked’等事件的处理:

      case 'resize':
case 'scale':
case 'locked':
if (this.canvas) {
this.props.dispatch({
type: 'canvas/update',
payload: {
data: this.canvas.data
}
});
}
break;
复制代码

3. 在layouts/headers.tsx页面,connect连接绑定数据

import { connect } from 'dva';

export default connect((state: any) => ({ canvasData: state.canvas }))(Headers);
复制代码

4. render函数显示即可

render(): React.ReactNode {
const { data } = this.props.canvasData;
const scale = Math.floor(data.scale);
......
}
复制代码

这里,我们没有特别业务处理,直接格式化显示即可。

三、本篇最后

顶部菜单导航栏基础功能完成。还是欢迎大家补充并提交GitHub的pr: 0. 阅读开发文档,了解相关属性。

  1. fork仓库到自己名下
  2. 本地修改并提交到自己的git仓库
  3. 在自己的fork仓库找到 “Pull request” 按钮,提交

其他

右键菜单和其他功能页面待续。

开源项目不易,欢迎大家一起参与,或资助服务器:

【前端新手也能做大项目】:跟我一起,从零打造一个属于自己的在线Visio项目实战【ReactJS + UmiJS + DvaJS】(二)的更多相关文章

  1. Netty+MUI从零打造一个仿微信的高性能聊天项目,兼容iPhone/iPad/安卓

    要说到微信,我相信是个人都应该知道,几乎人人都会安装这款社交APP吧,它已经成为了我们生活中不可缺少的一份子. 我记得我上大学那会刚接触Java,做的第一个小项目就是基于J2SE的聊天室,使用Java ...

  2. 【前端vue进阶实战】:从零打造一个流程图、拓扑图项目【Nuxt.js + Element + Vuex】 (一)

    本系列教程是用Vue.js + Nuxt.js + Element + Vuex + 开源js绘图库,打造一个属于自己的在线绘图软件,最终效果:topology.le5le.com .如果你觉得好,欢 ...

  3. 打造一个高逼格的android开源项目——小白全攻略 (转)

    转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...

  4. Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)

    Struts2,Spring,Hibernate是Java Web开发中最为常见的3种框架,掌握这3种框架是每个Java Web开发人员的基本功. 然而,很多初学者在集成这3个框架的时候,总是会遇到各 ...

  5. git 自己创建了一个项目A,我的同事fork一个B,当我的项目更新的时候,怎么样在他fork的repo上进行相应的更新?

    先把B clone到本地 git clone B_REPOSITORY_URL 再cd到本地B的目录,把A作为一个remote加到本地的B中(一般命名为upstream) git remote add ...

  6. 如何保证前端项目上线后的安全?webfunny已总结前端最关键的12大指标

    实时监控大屏   众所周知:实时流量大屏,是用来监控前端项目上线质量的. 如大家所知,监控系统会监控线上应用的各项指标,如:错误.白屏.耗时等等,但是仔细一想,即使有这些监控,我们也不一定能够保证线上 ...

  7. Web前端新手经典学习路线

    做前端开发八九年的时间,到2015年的时候,Web前端因为HTML5技术的高速发展,成为IT行业中最受欢迎和未来需求人才发展最好的职业,各个行业都想转行做前端开发,包括一些在校的学生,土木工程,一些不 ...

  8. 如何打造一个"逼格"的web前端项目

    最近利用空余的时间(坐公交车看教程视频),重新了解了前后端分离,前端工程化等概念学习,思考如何打造一个“逼格”的web前端项目. 前端准备篇 前端代码规范:制定前端开发代码规范文档. PS:重中之中, ...

  9. BAT、网易、京东等如何做大数据风控的?

    大数据风控目前应该是前沿技术在金融领域的最成熟应用,相对于智能投顾.区块链等还在初期的金融科技应用,大数据风控目前已经在业界逐步普及,从BATJ这样的大企业,到交易规模比较大的网贷平台,再到做现金贷. ...

随机推荐

  1. linux-pclint代码检测

    win10.ubuntu16.04, vs2017. 1.安装pc-lint到C盘. 2.将linux下的usr整个目录打包拷贝到win10某盘下. 3.获取lint检测linux c++ 代码的宏参 ...

  2. python编程系列---tcp客户端的简单实现

    实现流程如下: """ TCP客户端实现流程1. 创建一个tcp 客户端对象2. 与服务端建立连接3. 通过tcp socket 收发数据4. 关闭连接 关闭tcp &q ...

  3. eclipse 中配置maven环境

    选择 菜单栏 window -preferences-maven- installations 点击add 添加自己的maven 库 配置 setting 第一个为全局配置 第二个为用户配置可以覆盖全 ...

  4. 百万年薪python之路 -- 变量及if的练习

    1.简述变量命名规范 1.变量由数字,字母,下划线组成 2.不能以数字开头 3.不能使用python关键字 4.不能使用中文和拼音命名 5.区分大小写 6.变量名要具有描述性 7.推荐写法 7.1驼峰 ...

  5. Mysql数据库(四)表记录的更新操作

    一.插入表记录 1.使用INSERT...VALUES语句插入新纪录 (1)插入完整数据 mysql> desc tb_manager; +-------+------------------+ ...

  6. Andriod Studio设置类默认签名模板

  7. datatable dataset

    简单讲解一下dataset和datatable,以excel对比,dataset相当于一个excel文件,datatable相当于excel的一张表格.datatable可以单独应用,dataset里 ...

  8. 元素“context:component-scan”的前缀“context”未绑定

    首先报这个错误,你得明白,是什么原因导致的? 答:未引入命名空间,和约束文件 解决方法(加上标红色标记): <?xml version="1.0" encoding=&quo ...

  9. 本地客户端(自己的电脑)连接远程Oracle数据库(服务器端),客户端安装步骤

    如果本地自己的电脑没有安装Oracle(服务器端数据库),那就要单独安装HA-Instant Client-v11.2.0.3.0.exe(oracle_client客户端) 如果本地安装了Oracl ...

  10. mybatis-spring 启动过程和调用过程

    mybatis-spring 可以为我们做什么 mybatis框架已经很不错了,它把配置和执行sql的通用过程抽象出来.只要你符合mybatis框架的要求,首先有正确的配置,然后有model,inte ...