質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Q&A

解決済

1回答

1806閲覧

this.$setとthis.$deleteが未定義のままになる

FKM

総合スコア3647

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

0グッド

0クリップ

投稿2021/06/15 09:01

編集2021/06/16 00:07

どうやっても解決しなかったので、質問します。

自分がずっと開発に用いているVue CLIの環境ですが、どうやってもthis.$setとthis.$deleteというオブジェクト操作メソッドが使用できずに困っています。何が原因なのかご教授いただけたらと思います。

問題点

以下のエラーが出て、this.$setthis.$deleteが使用できないために、オブジェクトの操作ができない。

runtime-core.esm-bundler.js?5c40:217 Uncaught TypeError: this.$set is not a function

なお、this.$emitや$event.target.checkedなどは普通に機能しています。

ソース

Test.vue (親コンポーネント)

Test.vue

1<template> 2 <div v-for="(chkval,idx) in checkboxes"> 3 <sub-tab :chkval="chkval" @fromc="receive" :key="idx" ></sub-tab> 4 </div> 5 <ul v-for="(result,idx) in results"> 6 <li key="result.id">{{result.name}}</li> 7 </ul> 8</template> 9<script> 10import Vue from 'vue' 11import Sub from './Sub.vue' 12export default{ 13 name: 'Test', 14 components: { 15 'sub-tab': Sub, 16 }, 17 data(){ 18 return{ 19 checkboxes:[ 20 {id:1,name:'sapporo'}, 21 {id:2,name:'asahikawa'}, 22 {id:3,name:'hakodate'}, 23 ], 24 results: [], 25 } 26 }, 27 methods:{ 28 receive: function(chkval){ 29 console.log(this.$set) 30 console.log(this) 31 let vm = this 32 let results = this.results 33 //console.log(chkval) 34 let len = this.checkboxes.length 35 console.log(len) 36 /*for(var i = 0; i< len ; i++ ){ 37 this.$set(results,i,this.checkboxes[i]) 38 }*/ 39 console.log(results) 40 this.checkboxes.map((item,idx)=>{ 41 var vm = this 42 43 let ary = { 44 'id': item.id, 45 'name': item.name, 46 } 47 if(chkval.checked === true && chkval.id === item.id){ 48 this.$set('results',ary) //未定義関数エラーが起きる 49 }else{ 50 this.$delete(results,idx) //未定義関数エラーが起きる 51 } 52 }) 53 //console.log("*") 54 console.log(results) 55 this.results = results 56 } 57 }, 58} 59</script>

Sub.vue(子コンポーネント)

vue

1<template> 2 <label> 3 {{chkval.name}}<input type="checkbox" :value="chkval.id" @input="inputVal(chkval.id,$event.target.checked)" > 4 </label> 5</template> 6<script> 7export default{ 8 props:[ 9 'chkval', 10 ], 11 data(){ 12 return{ 13 dummy: [] 14 } 15 }, 16 methods:{ 17 inputVal(id,flg){ 18 let vals = { 19 "id": id, 20 "checked": flg, 21 } 22 //this.$set(this.dummy,0,vals) 23 this.$emit('fromc',vals) 24 } 25 }, 26} 27</script>

試したこと

色々試したのですが、どれも解決には至っていません。

他の記述方法を試した

this.$setが使用できないので、マニュアルにしたがってVue.setvm.$setも試してみたのですが、同様に関数ではないというエラーが出ます。

メソッド内でthisを代入してみた

以下のStackOverflowの議題の回答どおり、thisを代入してみたのですが、結局同じエラーとなりました。

TypeError: this.$set is not a function

import定義を付与してみた

main.jsとApp.vueとTest.vueそれぞれに

import Vue from 'vue

を記述してみたのですが、結局意味がありませんでした。また、メソッド内でconsole.log(Vue)とするとundefinedとなっていました。

mapをやめて、forでループしてみた

関数の内側なのが問題なのかと思い、forでも試してみたのですが、結局どこに置いてもエラーとなりました。また、子コンポーネントでもテストしたら、やはり認識エラーとなりました。

methods以外でテストしてみた

メソッドが問題なのではないかと考え、算出プロパティやライフサイクルフックでも試してみたのですが、やはり同じエラーとなります。

自宅の環境でテストしてみた

あれから自宅に戻り、自宅のVue操作環境でテストしたところ、普通に

js

1console.log(Vue) 2console.log(this.$set(array_test,0,"aaaaa")

が反応していました。なので、

js

1import Vue from 'vue'

が反応していない状態のようですが、原因は何なんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Vue3にアップデートさせたのがそもそもの原因だったようです。
どうやらthis.$setとthis.$deleteはVue3に後方互換性がありません。かといって
compositionAPIを使用しないと、Vue3の代替記法

results[idx] = ary delete retults[idx]

もリアクティブじゃないというエラーが生じてしまうので、根本的なcompositionAPIを用いた書き直しか、Vue2へのダウングレードが必要でした。

投稿2021/06/16 03:10

FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問