前提・実現したいこと
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
なんか質問のタイトルと内容が一致してない気がするのですが…
エラーメッセージの内容がshapeが未定義であるというものだったため、記述方法が誤っているのかと考えたため、どのように修正したら定義できるのだろうかと標題にしました。
どのような質問タイトルだとよかったでしょうか?
タイトルではcheckboxの値の定義についてとなっていますが、
本文だとデータが保存できないという方に焦点が当たっていて、
checkboxについては具体的に触れられていないので主題が異なっているなと思いました。
結果論で言えばどちらにも起因するものではありませんでしたが…
例えば『フォームへのデータ反映がエラーになる』とかが良いのではと思います。
ありがとうございます。
確かに言われてみればその通りですね。shapeはcheckboxから取得する値だったので、そちらの方に意識が向いていました。
タイトル修正しました!
お手数おかけしましたm(__)m
回答1件
あなたの回答
tips
プレビュー