(本文中 dataModel = dm = 数据容器, gv = graphView = g2d = 2D 视图)

初始化项目

使用 vue-cli 生成项目。生成注意以下几个问题

1. 建议手动配置 Manually select features

2. 勾选 Router

3. 配置设置 Indedicated config files

4. 项目初始化完成后增加 vue.config.js 并配置

module.exports = {
devServer: {
port: 12580
}
}

vue 启动项目默认在 8080 端口,容易冲突所以我们把这个端口设置走

5. .eslintrc.js 增加配置

  globals: {
ht: true
}

至此初始化项目完成。

引入 HT 相关资源

1. 引入 核心库

将 libs 文件夹拷贝进 public 目录下

2. 引入资源库(如果是基础项目可忽略这一步)

将 storage 文件夹拷贝进 public 目录下

3. index.html 插入如下代码

    <script>
window.htconfig = {
Default: {
convertURL: function(url){
// console.log(url);
return 'storage/' + url;
}
}
}
</script>
<script src='libs/core/ht.js'></script>
<script src='libs/plugin/ht-modeling.js'></script>
<script src='libs/plugin/ht-obj.js'></script>
<script src='libs/plugin/ht-edgetype.js'></script>
<script src='libs/plugin/ht-form.js'></script>
<script src="libs/plugin/ht-vector.js"></script>

至此项目搭建完成,可在命令行 npm run serve 运行起来项目,在浏览器访问 localhost:12580 (前面手动配置的端口) 访问项目

调试 HT 资源是否正确访问

在 views/Home.vue 下增加 created 生命周期,新建 ht.Node 节点并 console.log 出来,看控制台是否有正确输出。

<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'home',
components: {
HelloWorld
},
created: function() {
console.log(ht);
let n = new ht.Node();
console.log(n);
}
}
</script>

浏览器打开控制台如果正确输出 Node 节点表示 ht 引入成功

如上输出 Node 可进行下一步。否则检查前面流程,比如 eslint 配置,或者 script 导入是否成功

完成第一个拓扑图

完成至上一步后,接下来就需要把一个 ht 的 graphView 插入到 vue 组件里,我们在不同生命周期做不同工作,在 created 的时候创建 gv 和 dm,在 mounted 的时候把 gv 挂载到组件里, 并新建一个图元

1. 修改 template 如下

<template>
<div class='home ht-view'> </div>
</template>

2. 增加 style 参考如下

<style scoped>
.ht-view {
text-align: left;
position: relative;
width: 800px;
height: 500px;
margin: auto;
border: 1px solid #ccc;
}
</style>

3. 按上述计划修改 script,参考如下

export default {
name: 'home',
components: {
// HelloWorld
},
created: function() {
this.gv = new ht.graph.GraphView();
this.dm = this.gv.dm();
},
mounted: function() {
this.gv.addToDOM(this.$el); let node = new ht.Node();
this.dm.add(node);
}
}
</script>

保存后,浏览器会热更新,会得到如下图界面

如图左上方出现 1/4 个小电脑,此时一个 ht-vue 最简单的项目就搭建完成了。我们可以在视图中间的区域随意操作并修改 Home.vue 代码来刷新界面看效果。

关于资源:在 public 下建立 storage 文件夹,然后放入一张图片,比如我放入一张 ht.png

然后稍修改下代码:

  mounted: function() {
this.gv.addToDOM(this.$el); let node = new ht.Node();
node.p(400, 250);
node.setImage('ht.png');
this.dm.add(node);
}

刷新视图,实现第一个加载图片并展示的 HT demo。

可复用 2D 组件

上述实现了第一个小拓扑,但是直接修改 Home 组件达到目的,如果我们页面里面有很多拓扑,我们会考虑复用这个组件,下面开始可复用组件的一点介绍。

HT 的每一个作视图展示的组件都会有一个 dataModel 来管理数据,这个 dm 是可以复用的所以我们希望把他作为独立的载体而不是组件独享,这个我们在教程下一步会介绍到为什么。

基于此考虑 vue 组件的 dataModel 考虑由父节点管理,子节点 dataModel 借用 props 传递使用,但是带来一个问题是父节点如果没有传入 dm,子节点应该有一个默认的 dataModel 作使用,那么我们应该给 props 赋个默认值,这个值应该是子节点 graphView 默认的 dataModel。于是我们会想到给 vue 子组件 data 包裹一个 graphView,但是不幸的是 vue 组件 props 构建先于 data,所以导致无法给 props/dm 赋默认值,所以我们选择在 vue 生命周期 beforeCreate 来手动建立 graphView 节点。

于上考虑我们在 components 下面创建一个 HT2D.vue 的组件,代码参考如下

<template>
<div>
<div ref="htview"></div>
</div>
</template> <script>
export default {
name: 'HT2D',
props: {
dm: {
default: function() {
return this.g2d.dm();
}
}
},
data: function() {
return { }
},
watch: {
dm: function() {
this.g2d.dm(this.dm);
this.g2d.fitContent();
}
}, beforeCreate: function() {
this.g2d = new ht.graph.GraphView();
},
beforeMount: function() {
this.g2d.dm(this.dm);
},
mounted: function() {
this.g2d.addToDOM(this.$refs.htview);
this.g2d.fitContent();
}
}
</script>

然后在 views 下建一个 Embeded2D.vue 的组件使用这个 HT2D.vue,并传入一个 dm 来构建视图,可以在组件生命周期 created 加入一段测试代码,参考如下

<template>
<div>
<HT2D class='ht-view' :dm='dm' ref='g2d'></HT2D>
</div>
</template> <script>
import HT2D from '@/components/HT2D' export default {
name: 'Embeded2D',
components: {
HT2D,
},
data: function() {
return {
dm: new ht.DataModel(),
}
},
created: function() {
let node = new ht.Node();
node.setImage('group_image');
this.dm.add(node);
},
mounted: function() { }
}
</script> <style>
.ht-view {
text-align: left;
position: relative;
width: 800px;
height: 500px;
margin: auto;
border: 1px solid #ccc;
}
</style>

接下来修改下路由让这个组件展示出来,先修改下 router/index.js 的 routes 参考如下

const routes = [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/2d',
name: '2d',
component: () => import( '../views/Embeded2D.vue')
},
]

然后在修改下 APP.vue 的 route-link template 参考如下

<template>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/2d">2D</router-link>
</div>
<keep-alive>
<router-view />
</keep-alive> </div>
</template>  

刷新浏览器并点击路由导航 2D,会出现如下视图,代表第一个可复用 2D 组件创建成功。

这个案例中是 Embeded2D.vue 嵌套 HT2D 组件,然后以 props 的方式传入 dm 参数,那么可以在父组件中直接修改 dm 来改变视图展示,比如在 Embeded.vue 生命周期 mounted 做个小测试,参考如下

    mounted: function() {
setTimeout(() => {
let dm = new ht.DataModel(); let node = new ht.Node();
node.p(100, 100);
dm.add(node); node = new ht.Node();
node.p(200, 200);
dm.add(node); this.dm = dm;
}, 3000);
}

在 mounted 里面过 3S 重新声明一个 dm 并复制给 dm 对象。视图会同步刷新,这里注意下箭头函数和 vue function this 指向的问题,如上是没有问题的。

注意下 APP.vue 有给 router-view 加上 keep-alive 属性,这样在路由切换的时候不会直接销毁老的组件,可把 keep-alive 属性去掉,然后在 Home 和 2D 之间切换并操作下 2D 视图,比如缩放平移,然后再切换回来就能发现问题所在。到此一个基础 HT 案例和可复用 HT 组件已经介绍完。

可复用组件进阶

上述我们一直强调 gv 的复用,并独立出来 dm,因为 HT 数据呈现的视图可以共用一个 dataModel,以一个 ListView 为例介绍

ListView 介绍 (http://www.hightopo.com/guide/guide/core/listview/ht-listview-guide.html)

首先像 HT2D 一样我们在 components 下面建一个 HTList.vue 的文件,参考如下,注意去掉 fitContent 等方法,这些是 2D 视图专用的

<template>
<div>
<div ref="htview"></div>
</div>
</template> <script>
export default {
name: 'HTList',
props: {
dm: {
default: function() {
return this.list.dm();
}
}
},
data: function() {
return { }
},
watch: {
dm: function() {
this.list.dm(this.dm);
}
}, beforeCreate: function() {
this.list = new ht.widget.ListView();
},
beforeMount: function() {
this.list.dm(this.dm);
},
mounted: function() {
this.list.addToDOM(this.$refs.htview);
},
}
</script>

然后在 views 下面创建一个 MultiHTView.vue 的组件使用 HT2D 和 HTList,并传入相同的 dm,参考如下

<template>
<div class = 'ht-view'>
<HT2D class='ht-2d' :dm='dm'></HT2D>
<HTList class='ht-list' :dm='dm'></HTList>
</div>
</template> <script>
import HT2D from '@/components/HT2D'
import HTList from '@/components/HTList' export default {
name: 'Embeded2D',
components: {
HT2D,
HTList,
},
data: function() {
return {
dm: new ht.DataModel(),
}
},
created: function() {
let node = new ht.Node();
node.setImage('group_image');
node.setName("I'm group");
this.dm.add(node);
},
}
</script> <style scoped>
.ht-view, .ht-2d, .ht-list {
position: relative;
box-sizing: border-box;
}
.ht-view {
text-align: left;
width: 810px;
margin: auto;
}
.ht-2d, .ht-list{
width: 400px;
height: 300px;
float: left;
margin-right: 10px;
border: 1px solid #ccc;
}
.ht-list{
margin-right: 0;
}
</style>

最后修改下路由,router/index.js 参考增加如下路由

  {
path: '/multi',
name: 'multi',
component: () => import( '../views/MultiHTView.vue')
}

app 增加如下 router-link

<router-link to="/multi">Multi</router-link>

 然后刷新页面进入 Multi 出现如下则成功

这里 HT2D 和 HTList 都是 MultiHTView 组件传入的同一个 dm,可参考前面方法对 dm 做一段测试,MultiHTView 增加一段生命周期 mounted 测试

    mounted: function() {
setTimeout(() => {
var dm = new ht.DataModel(); let node = new ht.Node();
node.p(100, 100);
node.setName("I'm n1 node");
dm.add(node); node = new ht.Node();
node.p(200, 200);
node.setName("I'm n2 node");
dm.add(node); this.dm = dm;
}, 3000);
}

至此一个基本的 HT 2D 视图 + HT 2D 视图组件构建 + HT 多组件嵌套 vue 案例介绍基本完成。

序列化场景

  

HT Vue 集成的更多相关文章

  1. vue 集成 axios 发送post请求 payload导致后台无法接收到数据问题

    vue 集成axios之后,发送的post请求默认为payload 方式. 如果想改为正常的方式,需要增加headers头,并且将发送是数据json格式改为 querystring的方式. 安装依赖 ...

  2. OpenLayers Node环境安装运行构建-支持Vue集成OpenLayers

    NodeJS 环境安装包下载:https://nodejs.org/zh-cn/download/ 安装vue-cli3.0.1: https://cli.vuejs.org/guide/instal ...

  3. 利用官方的vue-cli脚手架来搭建Vue集成开发环境

    在利用vue-cli脚手架搭建vue集成环境之前,我们需要先安装nodejs的环境.如果在cmd中输入node --version和npm --version出现如下的版本信息,就说明安装已经成功了. ...

  4. vue集成cesium,webgis平台第一步(附源码下载)

    vue-cesium-platform Vue结合Cesium的web端gis平台 初步效果 笔记本性能限制,运行Cesium温度飙到70度以上.所以平时开发时先开发界面,之后加载Cesium地球 当 ...

  5. SpreadJS与Vue集成,苏宁集团『极客办公』系统开发案例

    “造极”如今已成为苏宁集团的年度核心关键词.“造极”在具体工作上的体现,代表着苏宁不断追求极致的工匠精神,即对待每一个环节,都要严格要求.精益求精.“极客办公”系统,正是在这种环境下应运而生.本期公开 ...

  6. Vue 集成easyUI

    原 Vue 集成easyUI https://blog.csdn.net/m0_37948170/article/details/84960320   参考vue官网用cli创建了Vue项目之后: n ...

  7. vue集成高德地图

    vue集成高德地图 前言 二.使用步骤 1.注册高德开发平台 2.vue 结尾 前言 之前玩Thymeleaf的时候玩过高德地图,现在无聊Vue项目也整个地图进去~ 二.使用步骤 1.注册高德开发平台 ...

  8. VUE集成keycloak和Layui集成keycloak

    一:KEYCLOAK配置部分: 1,下载keycloak,官网地址:https://www.keycloak.org/downloads.html.下载第一个就行 2,下载完毕之后,打开文件,访问 b ...

  9. vue集成ckeditor富文本框,怎么获取CKEditor实例?

    CKEDITOR 版本5 ,vue集成形式 vue集成ckeditor富文本框,由于不是通过js创建的富文本对象,所以,无法取得实例对象,官方说明 官方在builds-->Getting and ...

随机推荐

  1. Unity系统消息广播

    # 1.前言Unity自带消息系统,如SendMessage等,此方法利用的反射,且会反射游戏物体上的所有组件,对性能不友好.而且由于参数为方法名称,所以如果使用代码混淆,则会无法调用 方法,且难以追 ...

  2. 我发现了Unity3D的2D Light Renderer, 随后就把它抄了过来

    . 前几个月,偶然在群里看到有人讨论Unity3D光照,于是我又萌生了一个新的目标----把它抄过来! . 众所周知,3D渲染的整个流水线都跟光照密不可分,相关的技术更是数不甚数,而2D游戏的光照通常 ...

  3. Android Studio配置Socks5代理后Gradle运行不正常

    第一次在Mac上运行Android Studio,遇到了一系列问题,其中一个代理问题搞得我是不知所措,在此记录. 如果你遇到了如下图的问题,那么恭喜你你可能已经找到了解决方案也就是本文: 一般,我们为 ...

  4. HTTP 304状态码的详细讲解

    首先,对于304状态码不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应. 客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Mod ...

  5. FTP上传、下载文件Demo

    前言:最近在做一个app,负责写后台接口,客户那边给了一个FTP的账号密码过来,服务器上面放了一堆的PDF文件,让我们这边自己从上面拿,项目是spriongboot的,做个记录供以后参考. 一.app ...

  6. Python基础-语法知识

    ——编程语言的发展史 机器语言 优点:执行速度够快 缺点:开发效率非常低 汇编语言 优点:执行效率相较于机器语言略低 缺点:开发效率相较于机器语言略高 高级语言 C.C++.C#.java.PHP.p ...

  7. python中@property装饰器的使用

    目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...

  8. android内嵌H5页(webview)如何定位

    一.切换至webview后再定位元素 (1)获取页面上下文 contexts = driver.contexts (2)切换至webview driver.switch_to.context(cont ...

  9. NOIP 模拟29 B 侥幸

    这次考得好纯属是侥幸,我T3打表试数试了两个小时,没有想打T2的正解(其实是打不出来)所以这个T3A掉纯属是侥幸,以后还是要打正解 (以下博客最好按全选观看,鬼知道为啥这个样子!) 在这里也口胡一下我 ...

  10. JVM初体验

    一.设计堆内存溢出异常:OutOfMemoryError: public class Main { public static void main(String[] args) { List<D ...