2
2
3
3
## 组件化
4
4
5
- 前面做搜索功能时,为了美观我们定义过按钮的样式了 。正巧用户更新也需要按钮,为了避免样式相互冲突,先做点准备工作:把搜索框组件化。
5
+ 前面做搜索功能时,为了美观我们定义了按钮的样式 。正巧用户更新也需要按钮,为了避免样式相互冲突,先做点准备工作:** 把搜索框组件化** 。
6
6
7
- 组件化的方法前面已经讲过了,再来走一遍加深印象 。
7
+ > 组件化的方法前面已经讲过了,再来一遍加深印象 。
8
8
9
9
新建一个 ` SearchButton.vue ` 文件,把 ` BlogHeader.vue ` 中与搜索相关的内容全部搬运过来:
10
10
49
49
</style >
50
50
```
51
51
52
- 注意这里的搬运是有些小改动的,比如导入导出包的名字 ,不改就乱套了。
52
+ 注意这里的搬运是有些小改动的,比如组件导出的名字 ,不改就乱套了。
53
53
54
54
接着把 ` BlogHeader.vue ` 对应搜索的部分删掉(特别是样式):
55
55
82
82
// searchText 变量删除
83
83
}
84
84
},
85
- // methods 删除掉了
85
+ // methods 删除掉
86
86
mounted () {... }
87
87
}
88
88
}
94
94
</style >
95
95
```
96
96
97
- 同样也记得把用不到的导入导出包 、组件、名称都修改正确。
97
+ 同样也记得把用不到的库 、组件、名称都修改正确。
98
98
99
99
完成后刷新页面,确保功能正常就 OK。
100
100
103
103
用户资料的更改、删除最好有个单独的页面,这就带来两个很头疼的问题:
104
104
105
105
- 用户资料页面涉及 POST/PATCH 等操作,毫无疑问需要验证用户的身份和 token 有效性;巧的是前面写的 `BlogHeader.vue` 也有类似的需求。因此需要将** 验证代码** 重构为一个单独的函数,供大家调用。
106
- - 把** 验证代码** 抽象为单独的函数后,好死不死 `axios` 发送的请求是异步的,所以要将此处的异步代码转换为同步代码,否则 localStorage 的存取顺序会因为网速的快慢而不可预测,带来潜在 bug。
106
+ - 把** 验证代码** 抽象为单独的函数后,由于 `axios` 发送的请求是异步的,所以要将此处的异步代码转换为同步代码,否则 localStorage 的存取顺序会因为网速的快慢而不可预测,带来潜在 bug。
107
107
108
108
综合上述两条,让我们先来处理这最麻烦的部分。
109
109
@@ -169,10 +169,10 @@ export default authorization;
169
169
170
170
看起来和之前写的验证代码很像,但是有两个非常重要的区别:
171
171
172
- - 用 `async/await` : `async` 表示函数里含有异步操作,`await` 表示紧跟在后面的表达式需要等待结果。`await` 关键字只能用在 `async` 函数中,并且由于它返回的 `Promise` 对象运行的结果可能是 `rejected` ,所以最好放到 `try...catch` 语句中。
173
- - `async` 函数返回的不再是 `return` 后面的数据,而是 `Promise` 对象,因此调用它的位置需要改为 `Promise.then().catch( )` 进行异常处理。(有点像 `axios.then().catch( )`)
172
+ - `async/await` : `async` 表示函数里含有异步操作,`await` 表示紧跟在后面的表达式需要等待结果。`await` 关键字只能用在 `async` 函数中,并且由于它返回的 `Promise` 对象运行的结果可能是 `rejected` ,所以最好放到 `try...catch` 语句中。
173
+ - `async` 函数返回的不再是 `return` 后面的数据,而是包含数据的 `Promise` 对象,因此调用它的位置需要改为 `Promise.then().catch( )` 进行异常处理。(有点像 `axios.then().catch( )`)
174
174
175
- > Promise 对新手来说稍麻烦,篇幅有限不会展开讲原理 ,请善用搜索。
175
+ > Promise 对新手来说稍麻烦,篇幅有限不展开讲原理 ,请善用搜索。
176
176
177
177
## 用户中心
178
178
@@ -247,7 +247,7 @@ export default authorization;
247
247
alert ('Password too short .');
248
248
return
249
249
}
250
- // 旧 username 用于向接口发送请求
250
+ // 旧的 username 用于向接口发送请求
251
251
const oldName = storage.getItem('username.myblog');
252
252
// 获取已填写的表单数据
253
253
let data = {};
@@ -303,12 +303,12 @@ export default authorization;
303
303
</style >
304
304
```
305
305
306
- 核心就是脚本里的 ` authorization() ` 函数,这就是我们刚封装的验证函数嘛! 在它的 ` .then() ` 里,只干了下面这两件事情 :
306
+ 核心就是脚本里的 ` authorization() ` 函数,这就是我们刚封装的验证函数嘛。 在它的 ` .then() ` 里,干了下面这两件事情 :
307
307
308
308
- 检查函数返回的数据,如果登录失效,或者密码太短,则拒绝执行后面的逻辑。
309
309
- 拿到用户填写的表单数据,并取出保存在本地的令牌,发送到后端接口更新用户数据。
310
310
311
- 模板和样式都没什么新内容 ,读者捎带看一下就可以。
311
+ 模板和样式都没有新内容 ,读者捎带看一下就可以。
312
312
313
313
## 收尾工作
314
314
@@ -317,6 +317,8 @@ export default authorization;
317
317
修改 ` BlogHeader.vue ` 的代码:
318
318
319
319
``` html
320
+ <!-- frontend/src/components/BlogHeader.vue -->
321
+
320
322
<template >
321
323
<div id =" header" >
322
324
...
@@ -368,13 +370,11 @@ export default authorization;
368
370
height : 16px ;
369
371
border-radius : 5px ;
370
372
}
371
-
372
373
/* 容器 <div> - 需要定位下拉内容 */
373
374
.dropdown {
374
375
position : relative ;
375
376
display : inline-block ;
376
377
}
377
-
378
378
/* 下拉内容 (默认隐藏) */
379
379
.dropdown-content {
380
380
display : none ;
@@ -384,25 +384,21 @@ export default authorization;
384
384
box-shadow : 0 8px 16px 0 rgba (0 , 0 , 0 , 0.2 );
385
385
text-align : center ;
386
386
}
387
-
388
387
/* 下拉菜单的链接 */
389
388
.dropdown-content a {
390
389
color : black ;
391
390
padding : 12px 16px ;
392
391
text-decoration : none ;
393
392
display : block ;
394
393
}
395
-
396
394
/* 鼠标移上去后修改下拉菜单链接颜色 */
397
395
.dropdown-content a :hover {
398
396
background-color : #f1f1f1
399
397
}
400
-
401
398
/* 在鼠标移上去后显示下拉菜单 */
402
399
.dropdown :hover .dropdown-content {
403
400
display : block ;
404
401
}
405
-
406
402
/* 当下拉内容显示后修改下拉按钮的背景颜色 */
407
403
.dropdown :hover .dropbtn {
408
404
background-color : darkslateblue ;
@@ -415,7 +411,7 @@ export default authorization;
415
411
</style >
416
412
```
417
413
418
- - 将验证代码全部删除 ,变为调用 `authorization()` 函数。
414
+ - 将之前写的验证代码全部删除 ,变为调用 `authorization()` 函数。
419
415
- 将欢迎词替换为下拉框,选项里包含用户中心的入口。
420
416
421
417
最后把路由注册到 `index.js`:
0 commit comments