目录
1. 创建组件并配置路由
2. 页面布局
3. 展示文章详情
3.1 请求文章详情数据接口
4. 关于后端返回数据中的大数字问题
4.1 请求文章详情返回 404 问题
4.2 大整数解决方案
5. 处理内容加载状态
编辑
6. 关于文章正文的样式
7. 图片点击预览
8. 关注用户
8.1 视图处理与功能处理
8.2 loading 效果
8.3 组件封装
9. 文章收藏
9.1 封装组件
9.2 处理视图
9.3 功能处理
10. 文章点赞
11. 分享功能
12. 组件中的 v-model
12.1 $event 就是传递过来的参数
12.2 v-model 默认方式
12.3 自定义 v-model 的属性名和事件名
1. 创建组件并配置路由
① 创建 views/article/index.vue
组件
② 然后将该页面配置到根级路由
-
根据文章的 id 获取文章的详情内容
-
开启 prop传参,就是把路由中 params 传递的参数映射为组件中的 props 参数。
-
虽然通过 $route.params.articleId 的方式也能拿到,但是这个 articleId 需要再组件能频繁使用,所以可以使用该种快捷方式映射参数
-
官方文档:路由 props 传参
-
传递过来的参数可能是 number 类型也可能是 string 类型
-
如果通过点击文章列表项进来(to 路由的方式跳转过来),那么传递的过来的 id 的类型就是 number 类型,因为原始的 id 就是 number 类型
-
但是如果是通过地址的方式直接访问该页面,那么就是 string 类型,如:http://localhost:8080/#/article/11502073-e4c5-4254-887f-17eba7f1ba88
-
JSONBig.parse() 转化出来的大数字是一个对象,所以也可能是 object 类型
-
2. 页面布局
使用到的 Vant 中的组件:
-
NavBar 导航栏
-
Loading 加载
-
Cell 单元格
-
Button 按钮
-
Image 图片
-
Divider 分割线
-
Icon 图标
3. 展示文章详情
思路:
-
找到数据接口
-
封装请求方法
-
请求获取数据
-
模板绑定
3.1 请求文章详情数据接口
① 在 api/article.js
中新增封装接口方法
② 在组件中调用获取文章详情
③ 在created 生命周期函数中调用
④ 模板绑定
4. 关于后端返回数据中的大数字问题
4.1 请求文章详情返回 404 问题
- 之所以请求文章详情返回 404 是因为我们请求发送的文章 ID (article.art_id)不正确。
- JavaScript 能够准确表示的整数范围在
-2^53
到2^53
之间(不含两个端点),超过这个范围,无法精确表示这个值,这使得 JavaScript 不适合进行科学和金融方面的精确计算。
上面代码中,超出 2 的 53 次方之后,一个数就不精确了。 ES6 引入了Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
这两个常量,用来表示这个范围的上下限。
上面代码中,可以看到 JavaScript 能够精确表示的极限。
后端返回的数据一般都是 JSON 格式的字符串。
如果这个字符不做任何处理,你能方便的获取到字符串中的指定数据吗?非常麻烦。所以我们要把它转换为 JavaScript 对象来使用就很方便了。幸运的是 axios 为了方便我们使用数据,它会在内部使用 JSON.parse()
把后端返回的数据转为 JavaScript 对象。
javascript">// { id: 9007199254740996, name: 'Jack', age: 18 }
JSON.parse('{ "id": 9007199254740995, "name": "Jack", "age": 18 }')
可以看到,超出安全整数范围的 id 无法精确表示,这个问题并不是 axios 的错。
4.2 大整数解决方案
- 了解了什么是大整数的概念,接下来的问题是如何解决?
- json-bigint 是一个第三方包,它可以帮我们很好的处理这个问题。
- 使用步骤:
- 使用它的第一步就是把它安装到你的项目中。
- npm i json-bigint
- 导入到项目中
-
import JSONBig from 'json-bigint'
-
- 使用它的第一步就是把它安装到你的项目中。
-
JSONBig.parse() 把 JSON 格式的字符串转化为 js 对象
-
JSONBig.stringify() 把 js 对象转为 JSON 格式的字符串
-
JSONBig与原始 JSON 方法的区别就是上面的两个可以处理大数字的问题,不丢失精度
-
json-bigint 会把超出 JS 安全整数范围的数字转为一个 BigNumber 类型的对象,对象数据是它内部的一个算法处理之后的,我们要做的就是在使用的时候转为字符串来使用。
通过 Axios 请求得到的数据都是 Axios 处理(JSON.parse)之后的,我们应该在 Axios 执行处理之前手动使用 json-bigint 来解析处理。Axios 提供了自定义处理原始后端返回数据的 API:transformResponse
。
axios官网GitHub - axios/axios: Promise based HTTP client for the browser and node.js:GitHub - axios/axios: Promise based HTTP client for the browser and node.js
复制上述的代码,在 src/utils/request.js 下导入 json-bigint 进行配置
扩展:ES2020 BigInt
ES2020 引入了一种新的数据类型 BigInt(大整数),来解决这个问题。BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
参考链接:
-
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt
-
ES6 入门教程
5. 处理内容加载状态
需求:
-
加载中,显示 loading
-
加载成功,显示文章详情
-
加载失败,显示错误提示
-
如果 404,提示资源不存在
-
其它的,提示加载失败,用户可以点击重试重新加载
-
6. 关于文章正文的样式
文章正文包括各种数据:段落、标题、列表、链接、图片、视频等资源。
-
将 github-markdown-css 样式文件下载到项目中
-
引入下载的 css 文件,添加作用的 class 类名
-
在 postcss 中配置不要转换样式文件中的字号
7. 图片点击预览
① ImagePreview 图片预览 的使用
② 处理图片点击预览
思路:
- 从文章内容中获取到所有的 img DOM 节点
- 获取文章内容中所有的图片地址
- 遍历所有 img 节点,给每个节点注册点击事件
- 在 img 点击事件处理函数中,调用 ImagePreview 预览
代码实现:
-
预览图片效果函数
-
console.log(this.$refs.article_content) // undefined
-
原因:拿不到,因为 Vue 更新 DOM 是异步的,此时使用 $nextTick 解决 或者使用延时函数延时 0秒
-
解决方案一:延时函数
-
解决方案二:$nextTick 解决,一次拿不到就两次。
8. 关注用户
思路:
-
给按钮注册点击事件
-
在事件处理函数中
-
如果已关注,则取消关注
-
如果没有关注,则添加关注
-
下面是具体实现。
8.1 视图处理与功能处理
视图处理
功能处理
-
找到数据接口
-
封装请求方法
-
请求调用
-
视图更新
① 在 api/
follow.js
中添加封装请求方法
② 给关注/取消关注按钮注册点击事件
③ 在事件处理函数中
8.2 loading 效果
两个作用:
-
交互反馈
-
防止网络慢用户多次点击按钮导致重复触发点击事件
8.3 组件封装
9. 文章收藏
9.1 封装组件
9.2 处理视图
9.3 功能处理
思路:
-
给收藏按钮注册点击事件
-
如果已经收藏了,则取消收藏
-
如果没有收藏,则添加收藏
下面是具体实现。
① 在 api/article.js
添加封装数据接口
② 给收藏按钮注册点击事件
③ 处理函数
10. 文章点赞
article 中的 attitude
表示用户对文章的态度
-
-1
无态度 -
0
不喜欢 -
1
已点赞
思路:
-
给点赞按钮注册点击事件
-
如果已经点赞,则请求取消点赞
-
如果没有点赞,则请求点赞
① 添加封装数据接口
② 封装组件
③ 给点赞按钮注册点击事件
④ 处理函数
11. 分享功能
-
ShareSheet 分享面板: Vant 2 - Mobile UI Components built on Vue
12. 组件中的 v-model
12.1 $event 就是传递过来的参数
子组件:
父组件:
12.2 v-model 默认方式
- 当我们传递给子组件的数据既要使用还有修改的时候,
- 传递: props
- 修改:自定义事件
-
简写方式:在父组件组件上使用 v-model
-
默认传递 :value="count"
-
默认监听:@input="count = $event"
-
父组件:
子组件:
12.3 自定义 v-model 的属性名和事件名
- 如果需要修改 v-model 的规则名称,可以通过子组件的 model 属性来配置修改。
- 一个组件上只能使用一次 v-model
父组件:
子组件: