文章列表日期加载+删除文章

496 阅读5分钟

这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

日期

image.png 写代码时组件展示的是预期的效果,却无法筛选查看后台接收参数可知,格式需要转化

  • 由于组件已经格式化了所以这里不使用(format="yyyy-MM-dd")

  • 只把传过去的值改变下:value-format="yyyy-MM-dd"

image.png 清空会导致rangeDate变成[null[0],null[1]] 而我们想要的是【null,null】

这里需要在接收时进行判断

        begin_pubdate: this.rangeDate ? this.rangeDate[0] : null,
        end_pubdate: this.rangeDate ? this.rangeDate[1] : null

image.png

具体流程:

  1. 在data中添加rangeDate: []

image.png 2. 在初始化文章列表的函数中进行日期的接收

image.png 3. 在组件的v-model处绑定rangeDate

image.png

加载文章显示加载中特效

  1. UI组件中有v-loading可绑定一个boolean变量进行控制

image.png 这里可根据官方文档进行自定义设置

2.data中添加loading

image.png

  1. 在初始化文章列表的函数里,进行渲染表格前开启(改变页码),接收到后关闭
 loadArticles (page = 1) {
      this.loading = true
      getArticles({
        // 接收传过的的页码
        page: page,
        per_page: this.pageSize,
        // 每页的文章数
        // 文章状态
        status: this.status,
        // 频道id
        channel_id: this.channelId,
        begin_pubdate: this.rangeDate ? this.rangeDate[0] : null,
        end_pubdate: this.rangeDate ? this.rangeDate[1] : null
      }).then(res => {
        // 使用两个常量接收,由于只支持驼峰命名要给一个重命名total_count: totalCount
        const { results, total_count: totalCount } = res.data.data
        this.articles = results
        this.totalCount = totalCount
        // 得到数据关闭加载
        this.loading = false
      })
    },
    // page为回传的值
    onCurrentPage (page) {
      this.loadArticles(page)
    },
    onSizeChange (perPage) {
      this.pageSize = perPage
      // 这里由于改变了每页条数对应的per_page,要再次回调接口
      this.loadArticles()
    }

删除文章

  1. 封装请求接口(api/article.js)
// 删除文章
export const deleteArticles = articleId => {
  return request({
    method: 'DELETE',
    url: `/mp/v1_0/articles/${articleId}`
  })
}

2.组件接收接口

(1)import

(2) 注册点击事件+接口函数

image.png

 deleteArticle (articleId) {
      this.$confirm('确认删除吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteArticles(articleId).then(res => {
          this.$message({
            message: '删除成功',
            type: 'success'
          })
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消退出'
        })
      })
    }

出现问题 image.png

解决后端返回数据中的大数字问题:

JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值,这使得 JavaScript 不适合进行科学和金融方面的精确计算。

Math.pow(2, 53) // 9007199254740992

9007199254740992  // 9007199254740992
9007199254740993  // 9007199254740992

Math.pow(2, 53) === Math.pow(2, 53) + 1
// true

上面代码中,超出 2 的 53 次方之后,一个数就不精确了。

ES6 引入了Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER这两个常量,用来表示这个范围的上下限。

Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
// true
Number.MAX_SAFE_INTEGER === 9007199254740991
// true

Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER
// true
Number.MIN_SAFE_INTEGER === -9007199254740991
// true

如果这个字符不做任何处理,你能方便的获取到字符串中的指定数据吗?非常麻烦。

所以我们要把它转换为 JavaScript 对象来使用就很方便了。 axios 为了方便我们使用数据,它会在内部使用 JSON.parse() 把后端返回的数据转为 JavaScript 对象。

image.png 可以看到,超出安全整数范围的 id 无法精确表示,这个问题并不是 axios 的错。

因此我们这里就是这样的转换

vue视图里的: image.png 实际的: image.png 了解了什么是大整数的概念,接下来的问题是如何解决?

json-bigint 是一个第三方包,它可以帮我们很好的处理这个问题。

使用它的第一步就是把它安装到你的项目中。

npm i json-bigint
或
yarn add json-bigint

json-bigint 会把超出 JS 安全整数范围的数字转为一个 BigNumber 类型的对象,对象数据是它内部的一个算法处理之后的,我们要做的就是在使用的时候转为字符串来使用。

了解了 json-biginit 怎么回事儿之后,下一步是如何配置到我们的项目中?

解决思路:

Axios 会在内部使用 JSON.parse 把后端返回的数据转为 JavaScript 数据对象。
所以解决思路就是:不要让 axios 使用 JSON.parse 来转换这个数据,而是使用 json-biginit 来做转换处理。
axios 提供了一个 API:transformResponse可以使用json-biginit设置data

具体操作

  1. request.js 请求模块中添加处理代码:
/**
 * 基于 axios 封装的请求模块
 */
import axios from 'axios'
import JSONbig from 'json-bigint'

// 创建一个 axios 实例,说白了就是复制了一个 axios
// 我们通过这个实例去发请求,把需要的配置配置给这个实例来处理
const request = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/', // 请求的基础路径

  // 定义后端返回的原始数据的处理,阻止axios通过JSON.pares()转换造成的误差
  // 参数 data 就是后端返回的原始数据(未经处理的 JSON 格式字符串)
  transformResponse: [function (data) {
    // Do whatever you want to transform the data
    // console.log(data)

    // 后端返回的数据可能不是 JSON 格式字符串
    // 如果不是的话,那么 JSONbig.parse 调用就会报错
    // 所以我们使用 try-catch 来捕获异常,处理异常的发生
    try {
      // 如果转换成功,则直接把结果返回
      return JSONbig.parse(data)
    } catch (err) {
      console.log('转换失败', err)
      // 如果转换失败了,则进入这里
      // 我们在这里把数据原封不动的直接返回给请求使用
      return data
    }
  }]
})

………………………………
……………………………………


// 导出请求方法
export default request

2.接收id时要转换成字符串

image.png

原因是,json-bigint是一个数组,不是我们想要的的数据格式

image.png 扩展:ES2020 BigInt

ES2020 引入了一种新的数据类型 BigInt(大整数),来解决这个问题。BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。

参考链接:

删除成功更新当前页数据

1、在 data 中初始化 page 用来获取当前页码

image.png

2、将 page 绑定到分页组件上用来同步当前页码

:current-page.sync="page" sync修饰符,保证page与页码改变同步

image.png 3、删除成功,更新当前页数据

目前效果

image.png