• Vue3+typeScripte -03


    本节:编写商品列表的页面内容。

    一、编写商品列表的页面内容(1.搜索框,2.表格,3.分页)

    1.对应接口的ts文件要先写好。

    axios.create(config) 对axios请求进行二次封装

    1. import axios from "axios";
    2. //创建axios实例
    3. const service = axios.create({
    4. baseURL: "https://www.fastmock.site/mock/bf1fcb3c2e2945669c2c8d0ecb8009b8/api",
    5. timeout: 5000,//超时时间
    6. headers: {//编译语言
    7. "Content-type" : "application/json;charset=utf-8"
    8. }
    9. })
    10. //请求拦截
    11. //就是你请求接口的时候,我会先拦截下来,对你的数据做一个判断,或者携带个token给你
    12. service.interceptors.request.use((config) => {//请求的数据
    13. config.headers = config.headers || {} // 没有数据的话就设置为空设置为数据
    14. if(localStorage.getItem("token")){//先确保登录
    15. config.headers.token = localStorage.getItem("token") || ""
    16. }
    17. return config//必须返回出去,不然请求发不出去
    18. })
    19. //响应拦截:后端返回来的结果
    20. service.interceptors.response.use((res) => {
    21. const code : number = res.data.code//code是后端的状态码
    22. if(code != 200){
    23. return Promise.reject(res.data)
    24. //Promise.reject(res.data)可以返回失败的数据
    25. }
    26. return res.data//返回成功的数据
    27. },(err) => {
    28. console.log(err)//错误信息的处理
    29. })
    30. //因为别的地方要用,所以就把实例暴露出去,导出
    31. export default service
    1. //我要用到的一些接口
    2. import service from "@/request/index";
    3. import {ILoginData} from "@/type/login"; //引入接口
    4. // 登录接口
    5. export function login(data: ILoginData) {//接口ILoginData接口的变量名
    6. return service({
    7. url: "/login",
    8. method: "POST",
    9. data
    10. })
    11. }
    12. // 商品列表接口
    13. export function getGoodsList(){
    14. return service({
    15. url: "/getGoodsList",
    16. method: "GET"
    17. })
    18. }
    19. // 用户列表接口
    20. export function getUserList(){
    21. return service({
    22. url: "/getUserList",
    23. method: "GET"
    24. })
    25. }
    26. // 角色列表接口
    27. export function getRoleList(){
    28. return service({
    29. url: "/getRoleList",
    30. method: "GET"
    31. })
    32. }
    33. // 权限列表接口
    34. export function getAuthorityList(){
    35. return service({
    36. url: "/getAuthorityList",
    37. method: "GET"
    38. })
    39. }

    2.对应的数据规范化接口,数据的类,要写好,在type文件下,创建了goods.ts文件(文件名都可以自定义)

    1. //商品接口,规范显示数据的类型
    2. export interface ListInt{//写接口,ILoginData接口名
    3. userId: string,
    4. id: number,
    5. title: string,
    6. introduce:string
    7. }
    8. interface selectDataInt { //规范搜索数据的类型
    9. title:string,
    10. introduce: string,
    11. page: number,
    12. count: number,
    13. pagesize:number
    14. }
    15. export class InitData {
    16. selectData: selectDataInt = {//搜索数据的类
    17. title: "",
    18. introduce: "",
    19. page: 1,
    20. count: 0,
    21. pagesize:10
    22. }
    23. list:ListInt[]=[]//展示的内容数据的类
    24. }

     3.这里写的是搜索框的变量规范化。

    ts中重要的规范化变量步骤: 

    4、表格的使用

    (1)引入代码规范化的ts文件,引入接口获取后端数据,赋值给规范化里面定义好的数组,然后循环出来。这里只是表单的一个赋值

     5.分页的使用

    6、搜索数据 

    7.后面对代码进行了一个函数封装,优化了一下,在生命周期挂载的时候,封装了调用获取后端数据的接口方法,要用那个方法的话,直接调用封装好的方法名就可以了。

    全部代码:

    这里有一个点不明白,就是分页每一样大小本来为10,后面改成每一页,只有5,count就乘2了

     这里的原因是因为她是提前知道那个值的所以是写死的,这种写法是不正确的,应该直接用element里面的属性就可以了。

    上面的代码很多bug,上面的搜索也有问题,1.搜索了之后一次之后,就把搜索到的数据,放在了表格里面循环,其实不对,因为这样再次点击搜索之后,就是在搜索之后的数据里面查找,所以这样是查找不到的,应该把搜索到的数据,赋值到一个新的变量,然后显示在表单,但是总的数据是不变的。

    2.还有就是他获取一个数据之后,进行了一个判断,其实也不对,不应该是还写在else里面,因为写在else里面,执行了true的值,下面的 值就不执行判断了。

    修改之后的代码:

    1. <template>
    2. <div>
    3. <div class="select-box">
    4. <el-form :inline="true" :model="selectData" class="demo-form-inline">
    5. <el-form-item label="标题">
    6. <el-input v-model="selectData.title" placeholder="请输入关键字" />
    7. </el-form-item>
    8. <el-form-item label="详情">
    9. <el-input v-model="selectData.introduce" placeholder="请输入关键字" />
    10. </el-form-item>
    11. <el-form-item>
    12. <el-button type="primary" @click="onSubmit">查询</el-button>
    13. </el-form-item>
    14. </el-form>
    15. </div>
    16. <div>
    17. <!-- 表单的组件 :data="dataList.comList"遍历的数组-->
    18. <el-table :data="comList" style="width: 100%">
    19. <el-table-column prop="id" label="ID" width="180" />
    20. <el-table-column prop="title" label="标题" width="180" />
    21. <el-table-column prop="introduce" label="详情" />
    22. </el-table>
    23. <!-- prop绑定的是数组里面要展示出来的数据 label是标题 -->
    24. </div>
    25. <el-pagination
    26. @current-change="currentChange"
    27. @size-change="sizeChange"
    28. layout="prev, pager, next"
    29. :page-size="selectData.pagesize"
    30. :total="selectData.count" />
    31. <!-- @current-change当前页发生变化的时候触发的方法
    32. @size-change当页数大小发生变化的时候,触发方法
    33. 这里有个不懂的,pagesize原本为10,后面改成5,selectData.count*2
    34. -->
    35. </div>
    36. </template>
    37. <script lang="ts">
    38. // import { da } from 'element-plus/es/locale';
    39. import { computed, defineComponent, onMounted, reactive, toRefs, watch } from 'vue'
    40. import { getGoodsList } from '../request/api'//1.引入接口文档
    41. import { InitData,ListInt} from '../type/goods'//1.引入接口文档,变量规范化
    42. // 这里又犯了个错误,就是创建新的数组,位置放错了,导致报错
    43. export default defineComponent({
    44. setup() {//赋值后端数据:
    45. const data = reactive({...new InitData() });//实例化类
    46. onMounted(() => {//生命周期,挂载
    47. getGoods();
    48. }
    49. );
    50. const getGoods=()=> {
    51. getGoodsList().then((res) => { //2.使用这个接口文档里面的对应内容
    52. console.log(res);
    53. // 接收后台返回的数据
    54. data.list = [...res.data, {id: 34,
    55. introduce: "haha",
    56. title: "旺仔牛奶",
    57. userId: 1
    58. }];
    59. data.searchData = data.list;
    60. // selectData定义类里面的变量来接收后端传过来的数据
    61. data.selectData.count = res.data.length;//赋值数据的长度
    62. })
    63. }
    64. // 分页:定义一个计算属性
    65. // const dataList = reactive({
    66. // comList: computed(() => {
    67. // // 1---> [1 -10] 2---> [11-20] 3---> [21-30]
    68. // // data.selectData.page是第一条,但是数据是从下标开始取的,所以要-1,变成0
    69. // return data.list.slice( //(0, 10)从第0开始,截取10个数
    70. // (data.selectData.page - 1) * data.selectData.pagesize,//0乘任何数都为0
    71. // data.selectData.page * data.selectData.pagesize//1*10=10,包头不包尾,
    72. // )
    73. // })
    74. // })
    75. const comList = computed(() => {
    76. // 1---> [1 -10] 2---> [11-20] 3---> [21-30]
    77. // data.selectData.page是第一条,但是数据是从下标开始取的,所以要-1,变成0
    78. return data.searchData.slice( //(0, 10)从第0开始,截取10个数
    79. (data.selectData.page - 1) * data.selectData.pagesize,//0乘任何数都为0
    80. data.selectData.page * data.selectData.pagesize//1*10=10,包头不包尾,
    81. )
    82. });
    83. //把后端传过来的数据,放到类里面赋值
    84. const currentChange = (page: number) => {
    85. data.selectData.page = page
    86. }
    87. const sizeChange = (pagesize: number) => {
    88. data.selectData.pagesize = pagesize
    89. }
    90. // 搜索框,接收搜索框的数据,放在数组里面
    91. const onSubmit = () => {
    92. let arr: ListInt[] = [];//接收查询之后,展示的数据
    93. console.log(data.selectData, "data.selectData");
    94. if (data.selectData.title || data.selectData.introduce) {
    95. //判断标题输入框里面是否有值
    96. if (data.selectData.title) {
    97. arr = data.list.filter((value) => { //filter过滤判断value是真的就赋值,不是真的就不赋值
    98. return value.title.indexOf(data.selectData.title)!==-1
    99. //indexOf用搜索框数组里面的内去查找后端返回的数据里面,
    100. //是不是有对应的关键字,有就不等于-1,为true,返回给arr
    101. })
    102. } //判断详情输入框里面是否有值
    103. if (data.selectData.introduce) {
    104. arr = data.list.filter((value) => { //filter过滤判断value是真的就赋值,不是真的就不赋值
    105. return value.introduce.indexOf(data.selectData.introduce)!==-1
    106. //indexOf用搜索框数组里面的内去查找后端返回的数据里面,
    107. //是不是有对应的关键字,有就不等于-1,为true,返回给arr
    108. })
    109. }
    110. }
    111. else {
    112. arr = data.list;
    113. }
    114. data.searchData = arr//最後,把過濾了的數組,放在表格里面再次循环出来
    115. data.selectData.count = arr.length//总页数也发生改变
    116. };
    117. //監聽輸入框的屬性
    118. watch([() => data.selectData.title, () => data.selectData.introduce], () => {
    119. if (data.selectData.title == '' || data.selectData.introduce == '') {
    120. //如果不為空,就重新獲取數據,重新賦值
    121. onSubmit();
    122. }
    123. })
    124. // dataList
    125. return { ...toRefs(data), currentChange, sizeChange, comList, onSubmit };
    126. }
    127. })
    128. </script>
    129. <style scoped>
    130. </style>

    最后,写代码过程又犯了一个错误,就是数组的位置写错了,导致报错。

  • 相关阅读:
    AD9371 官方例程裸机SW 和 HDL配置概述(三)
    权威认可 | Smartbi为何屡获市场认可,多个权威报告给出答案
    软考中级 软件设计师备考经验
    c++知识点之 --输入输出
    多线程bind二次封装
    JavaScript:来一波Promise用法实例,可能是面试题吧
    【附源码】Python计算机毕业设计企业人事管理系统
    Easysearch压缩模式深度比较:ZSTD+source_reuse的优势分析
    ajax上传文件
    智能合约安全分析,假充值攻击如何突破交易所的防御?
  • 原文地址:https://blog.csdn.net/m0_59214979/article/details/126627852