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

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

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

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

Q&A

解決済

1回答

1475閲覧

フォームへのデータ反映がエラーになる

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

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

0グッド

0クリップ

投稿2021/11/19 07:39

編集2021/11/19 08:19

前提・実現したいこと

Vue.jsを利用して、蔵書管理アプリを作成しています。
本来であれば入力したデータは登録ボタンを押すと保存されるはずなのですが、ローカルストレージに反映されずにおります。
入力データを表示させるには、どのように値を定義したらいいのでしょうか?
エラーメッセージは下記の通りです。

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

vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in mounted hook: "TypeError: Cannot set properties of undefined (setting 'shape')" found in ---> <BookForm> at src/components/BookForm.vue <App> at src/App.vue <Root>
TypeError: Cannot set properties of undefined (setting 'shape')

該当のソースコード

Vue.js

1<template> 2<div id="form"> 3 <!-- 選択中の書籍を表示 --> 4 <BookInfo :book="book"></BookInfo> 5 <!-- レビュー入力のためのフォームを準備 --> 6 <el-form ref="form" :model="form" :rules="rules" label-width="120px"> 7 <el-form-item label="読書状況" prop="status"> 8 <el-radio-group v-model="form.status"> 9 <el-radio label="購入前">購入前</el-radio> 10 <el-radio label="購入後">購入後</el-radio> 11 <el-radio label="読了済">読了済</el-radio> 12 <el-radio label="その他">その他</el-radio> 13 </el-radio-group> 14 </el-form-item> 15 <el-form-item label="書籍の形"> 16 <el-checkbox-group v-model="form.shape"> 17 <el-checkbox label="紙の書籍">紙の書籍</el-checkbox> 18 <el-checkbox label="電子書籍">電子書籍</el-checkbox> 19 </el-checkbox-group> 20 </el-form-item> 21 <el-form-item label="読了日"> 22 <el-date-picker type="date" v-model="form.read"></el-date-picker> 23 </el-form-item> 24 <el-form-item label="コメント"> 25 <el-input type="textarea" size="large" v-model="form.comment"></el-input> 26 </el-form-item> 27 <el-form-item> 28 <el-button type="primary" @click="onsubmit">登録</el-button> 29 </el-form-item> 30 </el-form> 31</div> 32</template> 33 34<script> 35import { mapGetters, mapActions } from 'vuex' 36import BookInfo from './BookInfo.vue' 37import { UPDATE_CURRENT, UPDATE_BOOK } from '../store/mutation-types' 38 39export default { 40 name: 'book-form', 41 // ローカルコンポーネントを登録 42 components: { 43 BookInfo 44 }, 45 data() { 46 return { 47 book: {}, // 選択中の書籍 48 form: { // フォームの内容 49 status: '', // 読書状況 50 shape: [], // 書籍の形 51 read: '', // 読了日 52 comment: '' // コメント 53 }, 54 rules: { 55 status: [ 56 { required: true, message: '読書状況が未選択です', trigger: 'change' } 57 ] 58 } 59 } 60 }, 61 computed: mapGetters([ 'current', 'getBookById' ]), 62 // ページロード時の処理 63 created() { 64 // 選択中の書籍がない場合、トップページにリダイレクト 65 if(!this.current) { 66 this.$router.push('/') 67 } 68 // 選択中の書籍をbookプロパティに詰め替え 69 this.book = Object.assign({}, this.current) 70 }, 71 mounted() { 72 // 選択中の書籍でストア内の情報を検索 73 let b = this.getBookById(this.book.id) 74 // 既にレビューが存在する場合は、その内容をフォームに反映 75 if(b) { 76 this.form.status = b.status 77 this.from.shape = b.shape 78 this.form.read = b.read 79 this.form.comment = b.comment 80 } 81 }, 82 methods: { 83 // アクションとメソッドとを紐付け 84 ...mapActions([UPDATE_BOOK, UPDATE_CURRENT]), 85 // [登録]ボタンでデータを登録 86 onsubmit() { 87 // 入力値の検証を実行 88 this.$refs['form'].validate((valid) => { 89 // 検証に成功したらストアにも反映 90 if(valid) { 91 this[UPDATE_BOOK]( 92 Object.assign({}, this.book, this.form) 93 ) 94 // 選択中の書籍をクリア 95 this[UPDATE_CURRENT](null) 96 // 処理成功の通知メッセージを表示 97 this.$notify({ 98 title: '蔵書メーター', 99 message: this.$createElement('p', { style: 'color: #009' }, '蔵書データの登録/更新に成功しました。'), 100 duration: 2000 101 }) 102 // フォームの内容をクリア 103 this.form.status = '' 104 this.from.shape = [] 105 this.form.read = '' 106 this.form.comment = '' 107 // トップページにリダイレクト 108 this.$router.push('/') 109 } 110 }) 111 } 112 } 113} 114</script>

試したこと

this.from.shape = b.shape
上記一文を削除するとエラーメッセージがなくなるため、原因はここであると考えています。
ですが、どのように修正したらよいのかが分かりません。

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

vue:2.6.14
vue cli:4.5.15

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

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

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

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

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

surface_0

2021/11/19 07:53

なんか質問のタイトルと内容が一致してない気がするのですが…
退会済みユーザー

退会済みユーザー

2021/11/19 07:59

エラーメッセージの内容がshapeが未定義であるというものだったため、記述方法が誤っているのかと考えたため、どのように修正したら定義できるのだろうかと標題にしました。 どのような質問タイトルだとよかったでしょうか?
surface_0

2021/11/19 08:11

タイトルではcheckboxの値の定義についてとなっていますが、 本文だとデータが保存できないという方に焦点が当たっていて、 checkboxについては具体的に触れられていないので主題が異なっているなと思いました。 結果論で言えばどちらにも起因するものではありませんでしたが… 例えば『フォームへのデータ反映がエラーになる』とかが良いのではと思います。
退会済みユーザー

退会済みユーザー

2021/11/19 08:20

ありがとうございます。 確かに言われてみればその通りですね。shapeはcheckboxから取得する値だったので、そちらの方に意識が向いていました。 タイトル修正しました!
surface_0

2021/11/19 08:41

お手数おかけしましたm(__)m
guest

回答1

0

ベストアンサー

this.from.shape = b.shape

上記一文を削除するとエラーメッセージがなくなるため、原因はここであると考えています。

単純にformfromになってるスペルミスだと思います。

投稿2021/11/19 07:51

surface_0

総合スコア497

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

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

退会済みユーザー

退会済みユーザー

2021/11/19 07:54

入力ミスにまったく気付けていませんでした。。。 無事、期待する挙動になりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問