Vue.js 単一コンポーネントに画像ファイルを選択した時にブラウザでプレビュー(canvasとして)されるコードを書いたのですが、プレビューされません。
画像の選択があった場合に処理を実行したいので、computedに画像ファイルを選択した時にプレビュー表示するscriptを書き、previewImageを返したいので、dataにreturn : null(初期値は無)という考えで書いたのですが、
「app.js:14974 Uncaught TypeError: Cannot read properties of undefined (reading '0')」
となってしまいます。
Vue
1<template> 2 <canvas id="preview"></canvas> 3 <input type="file" name="image" accept="image/*" @change="previewImage(obj.files[0])" /> 4 <p> 5 <input type="text" id="canvas_text" value="我輩は犬である" /> 6 <button @click="drawText('preview', 'canvas_text')">文字を描く</button> 7 </p> 8</template> 9 10<script> 11export default { 12 13 data(){ 14 return{ 15 previewImage: null 16 } 17 }, 18 computed: { 19 previewImage: function (obj) { 20 const fileReader = new FileReader(); 21 fileReader.onload = function () { 22 const canvas = document.getElementById("preview"); 23 const ctx = canvas.getContext("2d"); 24 const image = new Image(); 25 image.src = fileReader.result; 26 image.onload = function () { 27 canvas.width = image.width; 28 canvas.height = image.height; 29 ctx.drawImage(image, 0, 0); 30 }; 31 }; 32 fileReader.readAsDataURL(obj.files[0]); 33 }, 34 }, 35 methods: { 36 37 //キャンバスに文字を描く 38 drawText: function (canvas_id, text_id) { 39 const canvas = document.getElementById(canvas_id); 40 const ctx = canvas.getContext("2d"); 41 const text = document.getElementById(text_id); 42 //文字のスタイルを指定 43 ctx.font = "32px serif"; 44 ctx.fillStyle = "#404040"; 45 //文字の配置を指定(左上基準にしたければtop/leftだが、文字の中心座標を指定するのでcenter 46 ctx.textBaseline = "center"; 47 ctx.textAlign = "center"; 48 //座標を指定して文字を描く(座標は画像の中心に) 49 const x = canvas.width / 2; 50 const y = canvas.height / 2; 51 ctx.fillText(text.value, x, y); 52 }, 53 }, 54}; 55</script>
どこを修正すればいいのでしょうか?
また、今回の場合、画像の選択があった場合に処理を実行したいので、computed で良かったのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/01 13:31
2021/12/01 13:34
2021/12/01 13:40 編集
2021/12/01 13:53 編集
2021/12/01 14:24
2021/12/01 14:40