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

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

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

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

ESLint

ESLintは、JavaScriptのための構文チェックツール。全検証ルールを自由に on/offでき、独自のプロジェクトに合わせたカスタムルールを容易に設定することが可能。公開されている様々なプラグインを組み込んで使用することもできます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

2回答

120閲覧

Vue3のeslint(vue/no-mutating-props)エラーについて

bobo

総合スコア48

Vue.js

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

ESLint

ESLintは、JavaScriptのための構文チェックツール。全検証ルールを自由に on/offでき、独自のプロジェクトに合わせたカスタムルールを容易に設定することが可能。公開されている様々なプラグインを組み込んで使用することもできます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2025/01/23 04:37

実現したいこと

Vue3で作成しています。
component内で親から受け取るpropsの値を直接編集している為、esLintエラーが出ているのは認識していますが、正常動作しているので行ってる処理自体は変更せず、esLintの警告をつぶしたいです。

  • esLintのエラーを取り除きたい

前提

以下の様に親コンポーネントから出力データを受け取り、カラム(このComponent)をクリックしたらウインドウを開きます。開いたウインドウが存在する場合はカラムにハイライトのStyleで表示させ、ウインドウが閉じていたらそのハイライトのStyleを除去します(ポーリングで行う)。

発生している問題・エラーメッセージ

propsで受け取っている値を直接編集しようとしている為、esLintで警告が出力される。

eslint(vue/no-mutating-props)

該当のソースコード

typescript

1<template> 2 <a href="#" @click="handleClick"> 3 <span :class="{ 'high-light': rowData.isPopup}">りんく</span> 4 </a> 5</template> 6... 7const props =defineProps({ 8 rowData: { 9 type: Object as PropType<DataRow>, 10 required: true, 11 } 12}) 13 14const popupWindow = new Map<string, Window | null>(); 15setInterval(() => { 16 const subWin = popupWindow.get(props.rowData.id); 17 if (subWin) { 18 props.rowData.isPopUp = !subWin.closed; ←ここがesLintエラーになってる 19 } 20}) 21 22const handleClick = () => { 23 const winObj = window.open("http://url", props.rowData.id, "width: 1000"); 24 popupWindow.set(props.rowData.id, winObj ); 25}

補足情報(FW/ツールのバージョンなど)

Vue3

よろしくお願いします。

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

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

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

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

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

FKM

2025/03/12 04:24

propsで取得された値はそのままだとProxy制御かかってるので更新不可です。 なので ``` const xxx = props.xxx ``` として、間にクッションを置く必要があります。また、今回の場合はリアクティブ制御が必要なので ``` const xxx = toRef(props.xxx) ``` として、データを開いた状態にする必要があるかも知れません。
guest

回答2

0

propsで取得された値はそのままだとProxy制御かかってるので更新不可です。

なので

const xxx = props.xxx

として、間にクッションを置く必要があります。また、今回の場合はリアクティブ制御が必要なので

const xxx = toRef(props.xxx)

として、データを開いた状態にする必要があるかも知れません。

投稿2025/03/12 04:25

FKM

総合スコア3660

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

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

0

defineProps の代わりに defineModel を使ったらいいのではないでしょうか?

https://ja.vuejs.org/api/sfc-script-setup#definemodel

vue

1<template> 2 <a href="#" @click="handleClick"> 3 <span :class="{ 'high-light': rowData.isPopup}">りんく</span> 4 </a> 5</template> 6<script setup lang="ts"> 7... 8const rowData =defineModel("rowData", { 9 type: Object as PropType<DataRow>, 10 required: true, 11}); 12 13const isPopup = computed({ 14 get() { 15 return rowData.value; 16 }, 17 set(isPopup) { 18 return rowData.value = {...rowData.value, isPopup}; 19 }, 20}); 21 22const popupWindow = new Map<string, Window | null>(); 23setInterval(() => { 24 const subWin = popupWindow.get(rowData.value.id); 25 if (subWin) { 26 isPopUp.value = !subWin.closed; 27 } 28}) 29 30const handleClick = () => { 31 const winObj = window.open("http://url", rowData.value.id, "width: 1000"); 32 popupWindow.set(rowData.value.id, winObj ); 33}

投稿2025/03/12 04:58

編集2025/03/12 04:59
juner

総合スコア752

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問