HTML的canvas不能放在Vue绑定元素中

大致目的:

  • 通过 fetch() 获得线条位置等数据
  • 在 HTML 的 <canvas> 元素中绘制线条
  • 将获得的附带的文字数据通过绑定 Vue 显示。
<html>
	<head>
		<title>test</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

		<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <script src="https://cdn.bootcss.com/qs/6.5.1/qs.min.js"></script>
	</head>
	
	<body>

        <div id="displayer_1">
            <div v-if="successfully_loaded">
                <h1>{{title}}</h1>
                <canvas id="main_canvas" width="800" height="800" style="background-color: cyan;"></canvas>
            </div>
            <div v-else>
                <h1>正在加载</h1>
            </div>
        </div>

        <script>

var main_canvas = document.getElementById('main_canvas');
var ctx = main_canvas.getContext('2d');

// test rectangle
ctx.beginPath();
ctx.lineWidth = "5";
ctx.strokeStyle = "red";
ctx.rect(20,20 , 40,60);
ctx.stroke();

function draw_line(x1,y1 , x2,y2){
    ctx.beginPath();
    ctx.lineWidth = "5";
    ctx.strokeStyle = "purple";
    ctx.moveTo(x1,y1);
    ctx.lineTo(x2,y2);
    ctx.stroke();
}
// test draw line
draw_line(10,10 , 60,100)


new Vue({
    el: '#displayer_1',
    data: {
        title: 'test',
        lines: [],
        successfully_loaded: false
    },

    created: function(){
        const query = Qs.parse(location.search.substring(1))
        result_filename = query.f

		fetch('/data.json')
        .then(response => response.json())
        .then(json => {
            this.title = json.title
            this.lines = json.lines

            console.log(this)
            this.successfully_loaded = true

            // Then, draw the lines ...
            draw_line(100,100 , 700 , 700);
		})
    }
})
        </script>
	</body>
</html>

以上 js 代码中,我先绘制了一个测试矩形和一个测试线条,再在加载数据后也绘制线条。但其运行时只显示一个空的蓝绿(cyan)底色画板。

但是,如果将 <canvas> 元素移出 Vue 绑定的 id=displayer_1 的元素,一切绘制正常:

<div id="displayer_1">
	<div v-if="successfully_loaded">
    	<h1>{{title}}</h1>
    </div>
    <div v-else>
        <h1>正在加载</h1>
    </div>
</div>

<!-- canvas 移出 Vue 绑定的元素 -->
<canvas id="main_canvas" width="800" height="800" style="background-color: cyan;"></canvas>

也许是 Vue 会对自己管理下的 canvas 子元素进行什么操作吧?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue,你可以通过将事件绑定canvas元素来实现点击事件的处理。下面是一种常见的方法: 1. 首先,在你的Vue组件,找到对应的canvas元素,并给它添加一个唯一的id属性,比如'id="mycanvas"'。 2. 在Vue的mounted生命周期钩子函数,通过getElementById方法获取到canvas元素的DOM对象,并为它添加一个点击事件监听器。可以参考引用的代码片段。 3. 在点击事件的回调函数,你可以使用事件对象的位置信息来判断哪个图形被点击了。你可以根据自己的需求,记录或处理点击事件。 例如,下面是一个示例代码: ``` <template> <div> <canvas id="mycanvas" width="400" height="300"></canvas> </div> </template> <script> export default { mounted() { const cvs = document.getElementById('mycanvas'); cvs.addEventListener('click', function(e) { // 在这里处理点击事件 // 可以使用事件对象e来获取鼠标点击的位置信息 // 比如可以通过e.clientX和e.clientY来获取鼠标点击的坐标 // 根据坐标判断哪个图形被点击了,然后进行相应的处理 }, false); } } </script> ``` 在这个示例,我们给canvas元素添加了一个id属性为'mycanvas',并在Vue组件的mounted生命周期钩子函数,获取到这个canvas元素并为它添加了一个点击事件的监听器。在点击事件的回调函数,你可以根据事件对象的位置信息来判断哪个图形被点击了,并进行相应的处理。 希望这个示例能帮助到你,如果有任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值