vue 引入canvas_vue里面引入react并相互通信

本文介绍了一个在Vue应用中引入React组件进行绘图,并实现两者间数据通信的解决方案。通过在Vue的mounted钩子中调用React方法初始化组件,并利用全局订阅发布模式实现在Vue和React之间传递数据。
摘要由CSDN通过智能技术生成

问题: 一个画图组件是用react做的,而页面是用vue来写的,怎么挂载,vue应用里的数据怎么传递到react里面呢。

react绘图功能和vue页面被分别打包成了两个包。

先来看下效果

先来了解下 生命钩子,需要在vue生命钩子的mounted里面调用react方法来绘制图形,可以在react代码里面暴露一个方法,

//react app

import App from './app/kon/index'

window.loadCanvas = function(param) {

ReactDOM.render(

projectId={param.projectId} //绘图组件需要它去请求api

isEdit={param.type == 'edit'} //图形有两种状态,查看和编辑状态

router={param.router} //在内部绘图完成可能会做一些vue-router层面的跳转,所以传递

/>, document.getElementById(param.id))

}

在vue里面的调用

mounted() {

// 在react app里面暴露该方法

window.loadCanvas({

type: 'edit',

id: 'reactApp',

projectId: this.$route.query.projectId

})

}

即vue挂载完成后初始化react组件。

数据通信 vue 传递到react 先实现一个全局的订阅发布(也可以直接使用backbone里面的事件模块Event)

utils={

Event:(function(){

var clientList={},listen,trigger,remove;

listen=function(key,fn){

clientList[key]=clientList[key] ||[];

clientList[key].push(fn);

};

trigger=function(){

var args=[].slice.call(arguments),

key=args.shift(),

fns=clientList[key];

// 修复bug 不是&&的关系 是或的关系

if(!fns || !fns.length){

return;

}

for(var i =0,len=fns.length;i

fns[i].apply(this,args);

}

};

remove=function(key,fn){

clientList[key]=[];

// fns=[];

return;

if(fns){

for(var i=0,len=fns.length;i

if(fns[i]){

fns.splice(i,1);

}

}

}

};

return {

trigger:trigger,

listen:listen,

remove:remove,

on:listen

}

})(),

}

数据是从vue传递到react,所以需要在react里面订阅,在vue里面触发 先再react绘图顶级组件里面订阅

componentWillMount() {

// 查看模式,从页面获取事件初始化

//防止trigger多次

utils.Event.remove('VMDATA')

//第一次绘图初始化

utils.Event.listen('VMDATA', param => {

this.initData(param)

})

utils.Event.remove('VMUPDATE')

//监听vue里点击切换楼栋时数据变化,此时需要重绘

utils.Event.listen('VMUPDATE', param=>{

this.updateData(param)

})

}

然后在vue里面

先获取数据,再绘制,绘制完后再传递数据

let canvasInit = _.after(2, () => {

utils.hideLoading()

this.$nextTick(() => {

window.loadCanvas({

type: 'show',

projectId: this.$route.query.projectId,

id: 'js_canvas',

router: this.$router

})

this.hadShowCanvas = true

utils.Event.trigger('VMDATA', canvasData)

this._canvasData = canvasData

})

})

当右侧点击按钮变化时

先进行数据过滤处理,再绘制

utils.Event.trigger('VMDATA', canvasDataFilter)

至此,整个从vue到react绘图搭建好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值