@@ -108,6 +108,7 @@ export default {
108
108
};
109
109
</script >
110
110
```
111
+
111
112
在 ` src/components ` 目录下新建第一个组件,取名为 ` Header.vue ` 写入以下代码,[ 点击查看源代码] ( https://github.com/Wscats/vue-cli/blob/master/src/components/Header.vue ) :
112
113
113
114
``` html
@@ -184,6 +185,7 @@ const state = reactive({ name: 'Eno Yao' })
184
185
## props
185
186
186
187
在 ` Vue2.0 ` 中我们可以使用 ` props ` 属性值完成父子通信,在这里我们需要定义 ` props ` 属性去定义接受值的类型,然后我们可以利用 ` setup ` 的第一个参数获取 ` props ` 使用。
188
+
187
189
``` js
188
190
export default {
189
191
props: {
@@ -199,6 +201,7 @@ export default {
199
201
```
200
202
201
203
我们在 ` App.vue ` 里面就可以使用该头部组件,有了上面的 ` props ` 我们可以根据传进来的值,让这个头部组件呈现不同的状态。
204
+
202
205
``` html
203
206
<template >
204
207
<div id =" app" >
@@ -336,17 +339,22 @@ export default {
336
339
## template refs
337
340
338
341
这里的输入框拥有两个状态,一个是有输入框的状态和无输入框的状态,所以我们需要一个布尔值 ` isFocus ` 来控制状态,封装了一个 ` toggle ` 方法,让 ` isFocus ` 值切换真和假两个状态。
342
+
339
343
``` js
340
344
const toggle = () => {
341
345
// isFocus 值取反
342
346
state .isFocus = ! state .isFocus ;
343
347
};
344
348
```
349
+
345
350
然后配合 ` v-bind:class ` 指令,让 ` weui-search-bar_focusing ` 类名根据 ` isFocus ` 值决定是否出现,从而更改搜索框的状态。
351
+
346
352
``` html
347
353
<div :class =" ['weui-search-bar', {'weui-search-bar_focusing' : isFocus}]" id =" searchBar" >
348
354
```
355
+
349
356
这里的搜索输入框放入了 ` v-model ` 指令,用于接收用户的输入信息,方便后面配合列表组件执行检索逻辑,还放入了 ` ref ` 属性,用于获取该 ` <input/> ` 标签的元素节点,配合` state.inputElement.focus() ` 原生方法,在切换搜索框状态的时候光标自动聚焦到输入框,增强用户体验。
357
+
350
358
``` html
351
359
<input
352
360
v-model =" searchValue"
@@ -535,7 +543,9 @@ export default {
535
543
``` bash
536
544
npm install axios --save
537
545
```
546
+
538
547
封装了一个请求列表数据方法,接口指向的是 ` Cnode ` 官网提供的 ` API ` ,由于 ` axios ` 返回的是 ` Promise ` ,所以配合 ` async ` 和 ` await ` 可以完美的编写异步逻辑,然后结合` onMounted ` 生命周期触发,并将方法绑定到视图层的查看更多按钮上,就可以完成列表首次的加载和点击查看更多的懒加载功能。
548
+
539
549
``` js
540
550
// 发送 ajax 请求获取列表数据
541
551
const loadMore = async () => {
@@ -553,10 +563,64 @@ const loadMore = async () => {
553
563
// 合并列表数据
554
564
state .news = [... state .news , ... data .data .data ];
555
565
};
566
+ onMounted (() => {
567
+ // 首屏加载的时候触发请求
568
+ loadMore ();
569
+ });
556
570
```
557
571
558
572
<img src =" ./screenshot/4.gif " />
559
573
574
+ ## computed
575
+
576
+ 接下来我们就使用另外一个属性 ` computed ` 计算属性,跟 ` Vue2.0 ` 的使用方式很相近,同样需要按需导入该模块:
577
+
578
+ ``` js
579
+ import { computed } from ' @vue/composition-api' ;
580
+ ```
581
+
582
+ 计算属性分两种,只读计算属性和可读可写计算属性:
583
+ ``` js
584
+ // 只读计算属性
585
+ let newsComputed = computed (() => news .value + 1 )
586
+ // 可读可写
587
+ let newsComputed = computed ({
588
+ // 取值函数
589
+ get : () => news .value + 2 ,
590
+ // 赋值函数
591
+ set : val => {
592
+ news .value = news .value - 3
593
+ }
594
+ })
595
+ ```
596
+
597
+ 这里我们使用可读可写计算属性去处理列表数据,还记得我们上一个组件 ` Search.vue ` 吗,我们可以结合用户在搜索框输入的检索值,配合 ` computed ` 计算属性来筛选对我们用户有用列表数据,所以我们首先从 ` store ` 的共享实例里面拿到 ` Search.vue ` 搜索框共享的 ` searchValue ` ,然后利用原生字符串方法 ` indexOf ` 和 数组方法 ` filter ` 来过滤列表的数据,然后重新返回新的列表数据 ` newsComputed ` ,并在视图层上配合 ` v-for ` 指令去渲染新的列表数据,这样做既可以在没搜索框检索值的时候返回原列表数据 ` news ` ,而在有搜索框检索值的时候返回新列表数据 ` newsComputed ` 。
598
+
599
+ ``` js
600
+ import store from " ../stores" ;
601
+ export default {
602
+ setup () {
603
+ const state = reactive ({
604
+ // 原列表数据
605
+ news: [],
606
+ // 通过搜索框的值去筛选后的新列表数据
607
+ newsComputed: computed (() => {
608
+ // 判断是否输入框是否输入了筛选条件,如果没有返回原始的 news 数组
609
+ if (store .state .searchValue ) {
610
+ return state .news .filter (item => {
611
+ if (item .title .indexOf (store .state .searchValue ) >= 0 ) {
612
+ return item;
613
+ }
614
+ });
615
+ } else {
616
+ return state .news ;
617
+ }
618
+ }),
619
+ searchValue: store .state
620
+ });
621
+ }
622
+ }
623
+ ```
560
624
561
625
# License
562
626
0 commit comments