前提・実現したいこと
書籍に記載されているソースコードを利用したハンズオンで、Vue.jsの学習中です。
本来であれば、inputフォームに入力した文字列が表示されるはずが、フォーム内に一切表示されません。
選択しているというカーソル表示は出るのですが、何を打ち込んでも文字が表示されないのです。
入力内容をフォーム内に表示させ、かつ検索結果に反映させたいのですが、どこが誤りなのでしょうか?
下記にデベロッパーツール上に出ているエラーメッセージを記載します。
発生している問題・エラーメッセージ
[Vue warn]: Property or method "keyword" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. found in ---> <BookSearch> at src/views/BookSearch.vue <App> at src/App.vue <Root>
[Vue warn]: Property or method "books" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. found in ---> <BookSearch> at src/views/BookSearch.vue <App> at src/App.vue <Root>
該当のソースコード
Vue.js
1<template> 2<div id="search"> 3 <!-- 検索フォームを定義 --> 4 <el-form :inline="true"> 5 <el-form-item label="キーワード"> 6 <el-input type="text" size="large" v-model="keyword"></el-input> 7 </el-form-item> 8 <el-form-item> 9 <el-button type="primary" @click="onclick">検索</el-button> 10 </el-form-item> 11 </el-form> 12 <hr> 13 <!-- マッチした書籍情報をリスト表示 --> 14 <BookInfo v-for="(b, i) of books" :linkable="true" :book="b" :index="i + 1" :key="b.isbn"></BookInfo> 15</div> 16</template> 17 18<script> 19import BookInfo from '../components/BookInfo.vue'; 20 21export default { 22 name: 'book-search', 23 // ローカルコンポーネントを登録 24 components: { 25 BookInfo 26 }, 27 date() { 28 return { 29 keyword: 'vuejs', // 検索キーワード 30 books: [] // 検索結果 31 } 32 }, 33 methods: { 34 // [検索]ボタンで書籍情報を検索 35 onclick: function() { 36 this.$http('https://www.googleapis.com/books/v1/volumes?q=' + this.keyword) 37 // 応答データをJSONデータとして取得 38 .then((response) => { 39 return response.json() 40 }) 41 // JSON文字列の内容をbooksプロパティ(配列)に詰め替え 42 .then((data) => { 43 this.books = [] 44 for (let b of data.items) { 45 let authors = b.volumeInfo.authors 46 let price = b.saleInfo.listPrice 47 let img = b.volumeInfo.imageLinks 48 this.books.push({ 49 id: b.id, // id値 50 title: b.volumeInfo.title, // 書名 51 author: authors ? authors.join(',') : '', // 著者 52 price: price ? price.amount : '-', // 価格 53 publisher: b.volumeInfo.publisher, // 出版社 54 published: b.volumeInfo.publishedDate, // 刊行日 55 image: img ? img.smallThumbnail : '', // 表紙画像 56 }) 57 } 58 }) 59 } 60 } 61} 62</script>
試したこと
https://teratail.com/questions/124265
Reactになりますが、上記を参考にスペルミスは確認したつもりです。
見逃しがあるようでしたら教えていただきたいです。
また、エラーメッセージから、keywordとBooksの定義がなされていないことは把握できたのですが、利用している書籍の最新の正誤表(最新更新:2021年11月11日)には記載がありませんでした。
補足情報(FW/ツールのバージョンなど)
vue:2.6.14
vue cli:4.5.15
ハンズオンとして使用している書籍は「これからはじめるVue.js実践入門」になります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/11/12 12:13