{"id":10465,"date":"2020-07-08T23:00:40","date_gmt":"2020-07-08T14:00:40","guid":{"rendered":"http:\/\/www.moonmile.net\/blog\/?p=10465"},"modified":"2020-07-08T23:23:35","modified_gmt":"2020-07-08T14:23:35","slug":"vue-js-%e3%81%a7%e5%ad%90%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%81%8b%e3%82%89%e8%a6%aa%e3%81%ab%e5%80%a4%e3%82%92%e9%80%81%e3%82%8b%ef%bc%88svg%e7%b7%a8%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.moonmile.net\/blog\/archives\/10465","title":{"rendered":"Vue.js \u3067\u5b50\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304b\u3089\u89aa\u306b\u5024\u3092\u9001\u308b\uff08SVG\u7de8\uff09"},"content":{"rendered":"<p>\u3053\u306e\u624b\u306e\u8a18\u4e8b\u306f\u7d50\u69cb\u3042\u308b\u306e\u3060\u3051\u3069\u3001\u6bce\u5ea6\u5fd8\u308c\u3066\u3057\u307e\u3046\u306e\u3067\u5099\u5fd8\u9332\u7684\u306b\u3002<\/p>\n<h2 id=\"%E3%82%84%E3%82%8A%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8\">\u3084\u308a\u305f\u3044\u3053\u3068<\/h2>\n<p>\u3053\u3093\u306a\u98a8\u306bSVG\u306b\u30d4\u30f3\u3092\u7f6e\u304d\u307e\u3059\u3002Vue.js \u3092\u4f7f\u3063\u3066\u3001SVG\u753b\u50cf\u306e\u30d4\u30f3\u306e\u4f4d\u7f6e\u3092\u89aa\u306e App.vue \u306b\u4f1d\u3048\u307e\u3059\u3002<\/p>\n<p><a href='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2020\/07\/images20200708_01org.jpg'><img src='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2020\/07\/images20200708_01thum.jpg' \/><\/a><\/p>\n<h2 id=\"appvue\">App.vue<\/h2>\n<p>\u89aa\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\uff08App.vue\uff09\u306e\u30c7\u30fc\u30bf\u3067\u6301\u3064\u306e\u306f map_x \u3068 map_y \u3067\u3001data() \u306e\u623b\u308a\u5024\u3067\u4fdd\u6301\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001\u305d\u306e\u307e\u307e App.vue \u5185\u3067 {{map_x}} \u3067\u53c2\u7167\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>\u65b9\u773c\u7d19\u3068\u30d4\u30f3\u3067\u8868\u793a\u306f Hello.vue \u3067\u6307\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<br \/>\nHello.vue \u5074\u306f max_x \u3068 max_y \u30d7\u30ed\u30d1\u30c6\u30a3\u3001\u5909\u66f4\u3057\u305f\u3068\u304d\u306e\u30a4\u30d9\u30f3\u30c8\u3092 updatePos \u3067\u8fd4\u305b\u308b\u3088\u3046\u306b\u3057\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"hljs\"><code>&lt;template&gt;\n  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"app\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>map_x: {{map_x}}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>map_y: {{map_y}}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Hello<\/span> \n     <span class=\"hljs-attr\">:map_x<\/span>=<span class=\"hljs-string\">\"map_x\"<\/span> \n     <span class=\"hljs-attr\">:map_y<\/span>=<span class=\"hljs-string\">\"map_y\"<\/span> \n     @<span class=\"hljs-attr\">updatePos<\/span>=<span class=\"hljs-string\">\"updatePos\"<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n&lt;<span class=\"hljs-regexp\">\/template&gt;\n\n&lt;script&gt;\nimport Hello from '.\/<\/span>components\/Hello.vue<span class=\"hljs-string\">'\n\nexport default {\n  name: '<\/span>App<span class=\"hljs-string\">',\n  components: {\n    Hello,\n  },\n  data() {\n    return {\n      map_x: 100,\n      map_y: 100,\n    };\n  },\n  methods: {\n    updatePos(x,y) {\n      this.map_x = x ;\n      this.map_y = y ;\n    }\n  }\n}\n&lt;\/script&gt;\n<\/span><\/code><\/pre>\n<h2 id=\"hellovue\">Hello.vue<\/h2>\n<p>\u89aa\u306e App.vue \u304b\u3089 max_x \u3068 map_y \u3092\u53d7\u3051\u53d6\u308b\u306e\u304c\u30d7\u30ed\u30d1\u30c6\u30a3\u3067 props \u306b\u8a18\u8ff0\u3057\u307e\u3059\u3002\u30d4\u30f3\u306f\u30de\u30a6\u30b9\u306e\u30af\u30ea\u30c3\u30af\uff08v-on:mousedown\uff09\u3067\u52d5\u304b\u305b\u308b\u3088\u3046\u306b\u3057\u3066\u3042\u308b\u306e\u3067\u3001\u5225\u9014\u30c7\u30fc\u30bf\u3068\u3057\u3066 pin_x \u3068 pin_y \u3092\u7528\u610f\u3057\u307e\u3059\u3002<br \/>\n\u30d7\u30ed\u30d1\u30c6\u30a3\u306e max_x \u3068 max_y \u306f\u89aa\u304b\u3089\u5f15\u304d\u6e21\u3055\u308c\u308b\u8aad\u307f\u53d6\u308a\u5c02\u7528\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u306a\u306e\u3067\u5225\u9014\u4ee3\u5165\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u969b\u306f\u3001pin_x \u3068 pin_y \u306f\u3001\u30d4\u30f3\u306e\u5148\u7aef\u306b\u5ea7\u6a19\u304c\u5408\u3046\u3088\u3046\u306b\u5c11\u3057\u88dc\u6b63\u3057\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"hljs\"><code>&lt;template&gt;\n  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Hello SVG<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svg<\/span>\n           <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"pic\"<\/span>\n           <span class=\"hljs-attr\">viewBox<\/span>=<span class=\"hljs-string\">\"0 0 600 400\"<\/span>\n           <span class=\"hljs-attr\">v-on:mousedown<\/span>=<span class=\"hljs-string\">\"mousedown()\"<\/span>\n      &gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">image<\/span> \n              <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"@\/assets\/images\/hogan.jpg\"<\/span> \/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">image<\/span>\n               <span class=\"hljs-attr\">:x<\/span>=<span class=\"hljs-string\">\"pin_x\"<\/span>\n               <span class=\"hljs-attr\">:y<\/span>=<span class=\"hljs-string\">\"pin_y\"<\/span>\n               <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"20px\"<\/span>\n               <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"58px\"<\/span>\n               <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"@\/assets\/images\/marker.svg\"<\/span>\n            \/&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">svg<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n&lt;<span class=\"hljs-regexp\">\/template&gt;\n\n&lt;script&gt;\nexport default {\n  name: 'Hello',\n  props: {\n    map_x: Number,\n    map_y: Number,\n  },\n  data() {\n    return {\n      pin_x: this.map_x - 10 ,\n      pin_y: this.map_y - 40 ,\n    }\n  },\n  methods: {\n    mousedown() {\n        const vbox = this.$refs.pic.viewBox ;\n        const pic_w = vbox.baseVal.width ;\n        const pic_h = vbox.baseVal.height ;\n        var r = this.$refs.pic.getBoundingClientRect();\n        var x = Math.round(Math.round(event.clientX-r.left) * pic_w\/<\/span>r.width) ;\n        <span class=\"hljs-keyword\">var<\/span> y = <span class=\"hljs-built_in\">Math<\/span>.round(<span class=\"hljs-built_in\">Math<\/span>.round(event.clientY-r.top)  * pic_h\/r.height);\n        <span class=\"hljs-keyword\">this<\/span>.pin_x = x - <span class=\"hljs-number\">10<\/span> ;\n        <span class=\"hljs-keyword\">this<\/span>.pin_y = y - <span class=\"hljs-number\">40<\/span> ;\n        <span class=\"hljs-keyword\">this<\/span>.$emit(<span class=\"hljs-string\">'updatePos'<\/span>, x, y );\n    },\n  },\n}\n&lt;<span class=\"hljs-regexp\">\/script&gt;\n<\/span><\/code><\/pre>\n<p>\u30de\u30a6\u30b9\u3092\u30af\u30ea\u30c3\u30af\u3057\u305f\u3068\u304d\u306e mousedown \u95a2\u6570\u3067\u306f\u3001\u30af\u30ea\u30c3\u30af\u3057\u305f\u5ea7\u6a19\u3092\u88dc\u6b63\u3059\u308b\u305f\u3081\u306b\u3061\u3087\u3063\u3068\u3084\u3084\u3053\u3057\u3044\u3053\u3068\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30af\u30ea\u30c3\u30af\u3057\u305f\u3068\u304d\u306e\u5ea7\u6a19\u3092\u8fd4\u3059\u305f\u3081\u306b\u3001this.$emit \u3067 updatePos \u30a4\u30d9\u30f3\u30c8\u3092\u547c\u3073\u51fa\u3057\u307e\u3059\u3002<\/p>\n<h2 id=\"vue-%E8%A6%AA%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E9%96%A2%E4%BF%82%E3%81%AF-mvvm-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84\">Vue \u89aa\u5b50\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u95a2\u4fc2\u306f MVVM \u30d1\u30bf\u30fc\u30f3\u3067\u306f\u306a\u3044<\/h2>\n<p>\u3064\u307e\u308a\u306f\u3001<\/p>\n<ul>\n<li>\u89aa\u304b\u3089\u5b50\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u6e21\u3059\u3068\u304d\u306f max_x, max_y \u306e\u3088\u3046\u306b\u30d7\u30ed\u30d1\u30c6\u30a3\u7d4c\u7531\u3067\u6e21\u3059<\/li>\n<li>\u5b50\u304b\u3089\u89aa\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u6e21\u3059\u3068\u304d\u306f updatePos \u30a4\u30d9\u30f3\u30c8\u306e\u3088\u3046\u306b this.$emit \u3092\u901a\u3057\u3066\u6e21\u3059<\/li>\n<\/ul>\n<p>\u306e\u3088\u3046\u306b\u306a\u308b\u306e\u3067\u3001MVVM \u30d1\u30bf\u30fc\u30f3\u306e\u3088\u3046\u306b\u5bfe\u79f0\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002Vue.js \u304c MVVM \u30d1\u30bf\u30fc\u30f3\u306a\u306e\u306f\u3001\u3072\u3068\u3064\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u5185\u3067\u306e\u4eee\u60f3 DOM \u3068\u306e\u3084\u308a\u53d6\u308a\u306e\u8a71\u3067\u3042\u3063\u3066\u3001\u89aa\u5b50\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306f oneway \u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u7d4c\u7531\u306a\u306e\u3060\u3001\u3068\u3002<\/p>\n<p>\u3068\u3044\u3046\u8a33\u3067\u3001\u52d8\u9055\u3044\u3057\u3066\u8ff7\u3063\u3066\u3044\u305f\u306e\u3067\u30e1\u30e2\u66f8\u304d\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u306e\u624b\u306e\u8a18\u4e8b\u306f\u7d50\u69cb\u3042\u308b\u306e\u3060\u3051\u3069\u3001\u6bce\u5ea6\u5fd8\u308c\u3066\u3057\u307e\u3046\u306e\u3067\u5099\u5fd8\u9332\u7684\u306b\u3002 \u3084\u308a\u305f\u3044\u3053\u3068 \u3053\u3093\u306a\u98a8\u306bSVG\u306b\u30d4\u30f3\u3092\u7f6e\u304d\u307e\u3059\u3002Vue.js \u3092\u4f7f\u3063\u3066\u3001SVG\u753b\u50cf\u306e\u30d4\u30f3\u306e\u4f4d\u7f6e\u3092\u89aa\u306e App.vue \u306b\u4f1d\u3048\u307e\u3059\u3002 App.vue \u89aa\u30b3\u30f3 &hellip; <a href=\"https:\/\/www.moonmile.net\/blog\/archives\/10465\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-10465","post","type-post","status-publish","format-standard","hentry","category-dev"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/10465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/comments?post=10465"}],"version-history":[{"count":1,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/10465\/revisions"}],"predecessor-version":[{"id":10466,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/10465\/revisions\/10466"}],"wp:attachment":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/media?parent=10465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/categories?post=10465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/tags?post=10465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}