質問編集履歴

5

内容変更

2021/06/05 11:31

投稿

TMTN
TMTN

スコア53

test CHANGED
@@ -1 +1 @@
1
- 【Vue x Firestore】サブレクション「bookmarks」から投稿情報を取得して表示させたい
1
+ 【Vue x Firestore】エラーード:TypeError: Cannot read property 'uid' of nullと出る。
test CHANGED
@@ -1,216 +1,36 @@
1
- #サブコレクション「bookmarks」から投稿情報を取得して表示させたい。
2
-
3
-
4
-
5
- list.vueにてsavePost()という関数名で投稿を保存するボタンを設け、
6
-
7
- 「users」というコレクションに「bookmarks」というサブコレクションを作成し
8
-
9
- bookmarksにlist: this.list(投稿情報)、uid(保存したユーザー)、time(保存した時間)を格納してます
1
+ #エラーコード:TypeError: Cannot read property 'uid' of nullと出る
10
-
11
-
12
-
13
- ![イメージ説明](d2babd3c871b777c88a51a034097ad47.png)
14
-
15
-
16
-
17
- #lis.vue(子コンポーネント)
18
-
19
-
20
-
21
- ```ここに言語を入力
22
-
23
- <img src="../assets/ブックマーク.jpg" alt="ブックマーク" class="bookmark-icon" @click="savePost" />
24
-
25
- ```
26
-
27
-
28
-
29
- ```ここに言語を入力
30
-
31
- export default {
32
-
33
- data() {
34
-
35
- return {
36
-
37
- };
38
-
39
- },
40
-
41
- props: {
42
-
43
- list: {
44
-
45
- type: Array
46
-
47
- },
48
-
49
- },
50
-
51
-
52
-
53
- savePost() {
54
-
55
- firebase
56
-
57
- .firestore()
58
-
59
- .collection("users")
60
-
61
- .doc(this.$route.params.uid)
62
-
63
- .collection("bookmarks")
64
-
65
- .add({
66
-
67
- uid: this.$route.params.uid,
68
-
69
- list: this.list,
70
-
71
- time: firebase.firestore.FieldValue.serverTimestamp(),
72
-
73
- })
74
-
75
- .then(() => {
76
-
77
- this.$swal("お気に入りに追加しました。", {
78
-
79
- icon: "success"
80
-
81
- });
82
-
83
- });
84
-
85
- },
86
-
87
- ```
88
2
 
89
3
 
90
4
 
91
5
 
92
6
 
7
+ 下記で行っていることはログイン中のユーザーのuidを取得して、ページ遷移の際に :to="`/board/${this.uid}`" として
93
8
 
94
-
95
- #board.vue(親コンポーネント)
9
+ URLでuidを取得しています。
96
10
 
97
11
 
98
12
 
99
- board.vueに子コンポネントListデータをprops渡しています。
13
+ そもそも使い方が誤っいたら大変お恥ずかしい話なのですが、エラーの解消方法がわからない状況です。
100
14
 
101
15
 
102
16
 
103
- ```ここに言語を入力
104
-
105
- <div class="post-items">
106
-
107
- <paginate name="paginate-log" tag="ol" :list="postData" :per="12">
108
-
109
- <List
110
-
111
- v-for="(list, index) in paginated('paginate-log')"
112
-
113
- :index="index"
114
-
115
- :list="list"
17
+ わかる方お力添えをいただけませんでしょうか。
116
-
117
- :userDatas="userDatas"
118
-
119
- :key="list.id"
120
-
121
- />
122
-
123
- </paginate>
124
-
125
- <paginate-links
126
-
127
- for="paginate-log"
128
-
129
- class="pagination flex"
130
-
131
- v-scroll-to="postTop"
132
-
133
- :show-step-links="true"
134
-
135
- >
136
-
137
- </paginate-links>
138
-
139
- <!--postDataのデータをlist関数とindex関数にそれぞれ格納-->
140
-
141
- </div>
142
-
143
- ```
144
18
 
145
19
 
146
20
 
147
- #bookmark.vue
21
+ よろしくお願いいたします。
148
22
 
149
23
 
150
24
 
151
- bookmarksというコンポーネントでサブコレクションの「bookmarks」からlist情報を表示させたいと考えておりますが、
152
-
153
- 以下現状、そのまま保存したユーザーの空listを表示させているだけになってしまっています。
154
25
 
155
26
 
27
+ ```js
156
28
 
157
- ```ここに言語を入力
29
+ created() {
158
30
 
159
- <div class="bookmarkList-posts">
31
+ const currentUser = firebase.auth().currentUser;
160
32
 
161
- <paginate name="paginate-bookmarkList" tag="ol" :list="bookmarkList" :per="3">
162
-
163
- <List
164
-
165
- v-for="(list, index) in paginated('paginate-bookmarkList')"
166
-
167
- :index="index"
168
-
169
- :list="list"
33
+ this.uid = currentUser.uid;
170
-
171
- :key="list.id"
172
-
173
- />
174
-
175
- </paginate>
176
-
177
- <paginate-links
178
-
179
- for="paginate-bookmarkList"
180
-
181
- class="pagination flex"
182
-
183
- :show-step-links="true"
184
-
185
- :style="bookmarkList == '' ? 'display:none;' : 'display:flex;'"
186
-
187
- ></paginate-links>
188
-
189
- </div>
190
-
191
- ```
192
-
193
-
194
-
195
- ```ここに言語を入力
196
-
197
- export default {
198
-
199
- data() {
200
-
201
- return {
202
-
203
- paginate: ["paginate-bookmarkList"],
204
-
205
- bookmarkList: []
206
-
207
- };
208
-
209
- },
210
-
211
-
212
-
213
- created() {
214
34
 
215
35
  firebase
216
36
 
@@ -218,48 +38,34 @@
218
38
 
219
39
  .collection("users")
220
40
 
221
- .doc(this.$route.params.uid)
41
+ .doc(currentUser.uid)
222
42
 
223
- .collection("bookmarks")
43
+ .get();
224
44
 
225
- .orderBy("time", "desc")
226
-
227
- .get()
228
-
229
- .then((snapshot) => {
230
-
231
- snapshot.forEach((doc) => {
232
-
233
- this.bookmarkList.push(doc.data());
234
-
235
- });
236
-
237
- });
238
-
239
- }
240
-
241
- };
45
+ },
242
46
 
243
47
  ```
244
48
 
245
49
 
246
50
 
51
+ ```html
52
+
247
- ![イメージ説明](29cdc96ccce3a5cd9c9a6351df65e334.png)
53
+ <router-link :to="`/board/${this.uid}`" class="header-link neon3 flash">POST</router-link>
54
+
55
+ ```
248
56
 
249
57
 
250
58
 
251
- 青で囲った[list]部を表示させたいのですが、「bookmarkList.list」としても表示されません・・
59
+ ```js
252
60
 
61
+ {
253
62
 
63
+ path: "/board/:uid",
254
64
 
255
- 原因は赤で囲ったエラーコードにもあるように「配列」で取得できておらず、「オブジェクト型」になっていることが
65
+ name: "Board",
256
66
 
257
- 原因かと思われますが、配列に変換させるようなやり方はあるのでしょうか・・
67
+ component: Board,
258
68
 
69
+ },
259
70
 
260
-
261
- 分かる方いらっしゃいましたらお力添えをいただきたいです。
262
-
263
-
264
-
265
- よろしくお願いいたします。
71
+ ```

4

内容修正

2021/06/05 11:31

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  list.vueにてsavePost()という関数名で投稿を保存するボタンを設け、
6
6
 
7
- 「users」というコレクションに「bookmarks」というサブコレクションを設けて、
7
+ 「users」というコレクションに「bookmarks」というサブコレクションを作成し
8
8
 
9
9
  bookmarksにlist: this.list(投稿情報)、uid(保存したユーザー)、time(保存した時間)を格納してます。
10
10
 

3

内容変更

2021/06/05 04:25

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  list: {
44
44
 
45
- type: Object
45
+ type: Array
46
46
 
47
47
  },
48
48
 
@@ -150,11 +150,7 @@
150
150
 
151
151
  bookmarksというコンポーネントでサブコレクションの「bookmarks」からlist情報を表示させたいと考えておりますが、
152
152
 
153
- 以下bookmarksドキュメント内list」とうフィールドをどのようにして取得するのか分からな状況です。
153
+ 以下現状、そまま保存したユーザーlistを表示させてるだけなってまっていす。
154
-
155
-
156
-
157
- ![イメージ説明](5cd18356413b50918295f403e3e48910.png)
158
154
 
159
155
 
160
156
 
@@ -222,16 +218,12 @@
222
218
 
223
219
  .collection("users")
224
220
 
221
+ .doc(this.$route.params.uid)
222
+
223
+ .collection("bookmarks")
224
+
225
225
  .orderBy("time", "desc")
226
226
 
227
- .doc(this.$route.params.uid)
228
-
229
- .collection("bookmarks")
230
-
231
- .doc()//取得の仕方が分からない箇所
232
-
233
- .where("uid", "==", this.uid)
234
-
235
227
  .get()
236
228
 
237
229
  .then((snapshot) => {
@@ -249,3 +241,25 @@
249
241
  };
250
242
 
251
243
  ```
244
+
245
+
246
+
247
+ ![イメージ説明](29cdc96ccce3a5cd9c9a6351df65e334.png)
248
+
249
+
250
+
251
+ 青で囲った[list]部を表示させたいのですが、「bookmarkList.list」としても表示されません・・
252
+
253
+
254
+
255
+ 原因は赤で囲ったエラーコードにもあるように「配列」で取得できておらず、「オブジェクト型」になっていることが
256
+
257
+ 原因かと思われますが、配列に変換させるようなやり方はあるのでしょうか・・
258
+
259
+
260
+
261
+ 分かる方いらっしゃいましたらお力添えをいただきたいです。
262
+
263
+
264
+
265
+ よろしくお願いいたします。

2

質問内容変更

2021/06/04 08:38

投稿

TMTN
TMTN

スコア53

test CHANGED
@@ -1 +1 @@
1
- 【Vue x Algolia】vue instantsearch使用して全文検索を実装したい
1
+ 【Vue x Firestore】サブコレクション「bookmarks」から投稿情報取得して表示させたい
test CHANGED
@@ -1,191 +1,251 @@
1
- #Algolia vue instantsearch使用して全文検索を実装したい。
1
+ #サブコレクション「bookmarks」から投稿情報取得して表示させたい。
2
+
3
+
4
+
2
-
5
+ list.vueにてsavePost()という関数名で投稿を保存するボタンを設け、
6
+
3
-
7
+ 「users」というコレクションに「bookmarks」というサブコレクションを設けて、
4
-
8
+
5
- 全文検索を実装したくFirebaseの公式でも推奨しているAlgolia導入たいと考えおります。
9
+ bookmarkslist: this.list(投稿情報)、uid(保存したユーザー)、time(保存した時間)格納してます。
6
-
7
-
8
-
9
- Vueに導入するにあたって大変便利なものがあり、vue instantsearchというものがあるそうです。
10
+
10
-
11
-
12
-
11
+
12
+
13
- 公式サトを参照しながら実装を試みているのですが、下記点が分からず行き詰ってしまっております。。
13
+ ![メージ説明](d2babd3c871b777c88a51a034097ad47.png)
14
-
15
-
16
-
17
- 以下につきましては公式サイトを参照し、実装済です。
14
+
18
-
19
-
20
-
15
+
16
+
21
- #vue-instantsearchのイール
17
+ #lis.vue(子コポーネン
22
-
18
+
19
+
20
+
23
- ```terminal:npm
21
+ ```ここに言語を入力
24
-
22
+
25
- $ npm install --save vue-instantsearch
23
+ <img src="../assets/ブックマーク.jpg" alt="ブックマーク" class="bookmark-icon" @click="savePost" />
26
-
24
+
27
- ```
25
+ ```
28
-
29
-
30
-
26
+
27
+
28
+
31
- ```json:package.json
29
+ ```ここに言語を入力
32
-
30
+
33
- "dependencies": {
31
+ export default {
32
+
34
-
33
+ data() {
34
+
35
+ return {
36
+
37
+ };
38
+
39
+ },
40
+
41
+ props: {
42
+
43
+ list: {
44
+
35
- "algoliasearch": "^4.9.1",
45
+ type: Object
36
-
46
+
37
- "vue-instantsearch": "^3.7.0",
47
+ },
38
-
39
-   "instantsearch.css": "^7.4.5",
40
48
 
41
49
  },
42
50
 
43
- ```
44
-
45
-
46
-
47
- #InstantSearchプラグインの設定
48
-
49
-
50
-
51
- ```javascript:main.js
52
-
53
- import Vue from "vue";
54
-
55
- import App from "./App.vue";
56
-
57
- import router from "./router";
58
-
59
- import store from "./store";
60
-
61
- import firebase from "firebase";
62
-
63
- import InstantSearch from "vue-instantsearch";
64
-
65
- import "instantsearch.css/themes/satellite.css";
66
-
67
-
68
-
69
- Vue.use(InstantSearch);
70
-
71
-
72
-
73
- Vue.config.productionTip = false;
74
-
75
-
76
-
77
- const firebaseConfig = {
78
-
79
- ~ 省略 ~
51
+
52
+
53
+ savePost() {
54
+
55
+ firebase
56
+
57
+ .firestore()
58
+
59
+ .collection("users")
60
+
61
+ .doc(this.$route.params.uid)
62
+
63
+ .collection("bookmarks")
64
+
65
+ .add({
66
+
67
+ uid: this.$route.params.uid,
68
+
69
+ list: this.list,
70
+
71
+ time: firebase.firestore.FieldValue.serverTimestamp(),
72
+
73
+ })
74
+
75
+ .then(() => {
76
+
77
+ this.$swal("お気に入りに追加しました。", {
78
+
79
+ icon: "success"
80
+
81
+ });
82
+
83
+ });
84
+
85
+ },
86
+
87
+ ```
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+ #board.vue(親コンポーネント)
96
+
97
+
98
+
99
+ board.vueにて子コンポーネントのListデータをpropsで渡しています。
100
+
101
+
102
+
103
+ ```ここに言語を入力
104
+
105
+ <div class="post-items">
106
+
107
+ <paginate name="paginate-log" tag="ol" :list="postData" :per="12">
108
+
109
+ <List
110
+
111
+ v-for="(list, index) in paginated('paginate-log')"
112
+
113
+ :index="index"
114
+
115
+ :list="list"
116
+
117
+ :userDatas="userDatas"
118
+
119
+ :key="list.id"
120
+
121
+ />
122
+
123
+ </paginate>
124
+
125
+ <paginate-links
126
+
127
+ for="paginate-log"
128
+
129
+ class="pagination flex"
130
+
131
+ v-scroll-to="postTop"
132
+
133
+ :show-step-links="true"
134
+
135
+ >
136
+
137
+ </paginate-links>
138
+
139
+ <!--postDataのデータをlist関数とindex関数にそれぞれ格納-->
140
+
141
+ </div>
142
+
143
+ ```
144
+
145
+
146
+
147
+ #bookmark.vue
148
+
149
+
150
+
151
+ bookmarksというコンポーネントでサブコレクションの「bookmarks」からlist情報を表示させたいと考えておりますが、
152
+
153
+ 以下bookmarksのドキュメント内の「list」というフィールドをどのようにして取得するのか分からない状況です。
154
+
155
+
156
+
157
+ ![イメージ説明](5cd18356413b50918295f403e3e48910.png)
158
+
159
+
160
+
161
+ ```ここに言語を入力
162
+
163
+ <div class="bookmarkList-posts">
164
+
165
+ <paginate name="paginate-bookmarkList" tag="ol" :list="bookmarkList" :per="3">
166
+
167
+ <List
168
+
169
+ v-for="(list, index) in paginated('paginate-bookmarkList')"
170
+
171
+ :index="index"
172
+
173
+ :list="list"
174
+
175
+ :key="list.id"
176
+
177
+ />
178
+
179
+ </paginate>
180
+
181
+ <paginate-links
182
+
183
+ for="paginate-bookmarkList"
184
+
185
+ class="pagination flex"
186
+
187
+ :show-step-links="true"
188
+
189
+ :style="bookmarkList == '' ? 'display:none;' : 'display:flex;'"
190
+
191
+ ></paginate-links>
192
+
193
+ </div>
194
+
195
+ ```
196
+
197
+
198
+
199
+ ```ここに言語を入力
200
+
201
+ export default {
202
+
203
+ data() {
204
+
205
+ return {
206
+
207
+ paginate: ["paginate-bookmarkList"],
208
+
209
+ bookmarkList: []
210
+
211
+ };
212
+
213
+ },
214
+
215
+
216
+
217
+ created() {
218
+
219
+ firebase
220
+
221
+ .firestore()
222
+
223
+ .collection("users")
224
+
225
+ .orderBy("time", "desc")
226
+
227
+ .doc(this.$route.params.uid)
228
+
229
+ .collection("bookmarks")
230
+
231
+ .doc()//取得の仕方が分からない箇所
232
+
233
+ .where("uid", "==", this.uid)
234
+
235
+ .get()
236
+
237
+ .then((snapshot) => {
238
+
239
+ snapshot.forEach((doc) => {
240
+
241
+ this.bookmarkList.push(doc.data());
242
+
243
+ });
244
+
245
+ });
246
+
247
+ }
80
248
 
81
249
  };
82
250
 
83
-
84
-
85
- firebase.initializeApp(firebaseConfig);
86
-
87
-
88
-
89
- new Vue({
90
-
91
- router,
92
-
93
- store,
94
-
95
- render: (h) => h(App),
96
-
97
- }).$mount("#app");
98
-
99
-
100
-
101
- ```
251
+ ```
102
-
103
-
104
-
105
- #実装コードの追加
106
-
107
-
108
-
109
- ```html:post.vue
110
-
111
- <ais-instant-search
112
-
113
- :search-client="searchClient"
114
-
115
- index-name="cinema-app"
116
-
117
- >
118
-
119
- <ais-search-box
120
-
121
- placeholder="例)アクション 恋愛 ミステリー SF ホラー ミュージカル etc.."
122
-
123
- class="search-main-item"
124
-
125
- />
126
-
127
- </ais-instant-search>
128
-
129
-
130
-
131
- ```
132
-
133
-
134
-
135
- ```javascript:post.vue
136
-
137
- import algoliasearch from "algoliasearch/lite";
138
-
139
- import "instantsearch.css/themes/satellite.css";
140
-
141
-
142
-
143
- export default {
144
-
145
- data() {
146
-
147
- return {
148
-
149
- searchClient: algoliasearch(
150
-
151
- "API id",
152
-
153
- "API key"
154
-
155
- ),
156
-
157
- ```
158
-
159
-
160
-
161
- 現在、下記写真のようにais-search-boxのみ追加しております。
162
-
163
-
164
-
165
- ![イメージ説明](499102546b282aa74664470b4d2db197.png)
166
-
167
-
168
-
169
- #ご教示頂きたい点
170
-
171
- ⑴satellite.cssを導入しておりますが、CSSでサイズやカラーを変更したいのですがCSSが適用されません。。
172
-
173
- satellite.css以外に何か適用させないといけないものがあるのでしょうか。
174
-
175
- 検索ボタン等も追加したいです。
176
-
177
-
178
-
179
- ⑵検索結果も表示させたいのですが、同ページにはなりますがが別コンポーネントの場合
180
-
181
- どのように記述をすればいいのか分からない状況です。。
182
-
183
-
184
-
185
-
186
-
187
- 以上、分かる方いらっしゃいましたが大変申し訳ございませんが、お力添えをいただきたいです。
188
-
189
-
190
-
191
- よろしくお願いいたします。

1

内容修正

2021/06/04 06:26

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- につきましては公式サイトを参照し、実装済です。
17
+ 下につきましては公式サイトを参照し、実装済です。
18
18
 
19
19
 
20
20