05-vue新闻移动端项目总结

1 javascri 有逻辑时加冒号 字符串时不加

变量接收时和改变属性时 props加

this. $router.push( )

2 axios 的安装使用

// 1 引入
import axios from "axios";
将包变成变量

// 2 绑定到原型
Vue.prototype.$axios = axios;

在main.js中引用

2.1axios 发送get参数的两种方式

1 老方法

2 新方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9X2vvhO7-1611224627070)(vue新闻移动端项目总结.assets/image-20201119111440725.png)]

localhost:3000/post?pageIndex=1&pageSize=2&category=8

这种用

3 vent ui 插件的使用 首字母注意大小写

1 ,按需引入示列

// 1 引入组件
import { Toast } from 'vant';
//  2 引入组件css
import 'vant/lib/toast/style'
// 注册
Vue.use(Toast);

在main.js中引用

2 vue里调用

this.$toast()

括号里可使用参数调节 , 具体看官网

3 main.js 调用

Toast()


​ 全局转按需

在这里插入图片描述

image-20201205085706125

4 父级里创建事件 @click . native

[

在这里插入图片描述

有时候我们不需要子组件传递参数 , 就不用麻烦的 this.$emit( ) , 只想单纯的想创建事件时 ,

父级里利用原生native的办法创建事件

5 利用侦听属性发送用户的值 , 给axios参数

1 侦听属性 , 将最新的new值发送给父级

2 父级创建函数接受new值 , 并赋值给本身data属性

3 axios 里的data 参数 发送this.属性

6 再次总结 get id 发送

vue 分为两个方式 传递参数

1 ?= 拼接 这种this.route.query 截取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIWbgW9s-1611224627076)(vue新闻移动端项目总结.assets/image-20201127233440933.png)]

1.1 行内跳转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WYi20OrK-1611224627079)(05-vue新闻移动端项目总结.assets/image-20201219101000718.png)]

2 编程式跳转 这种配置路由参数 地址再/给参数值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SeB4kMDc-1611224627081)(vue新闻移动端项目总结.assets/image-20201127234021424.png)]
在这里插入图片描述

2.1 行内式 (变量情况下 比如state里值) : 模板字符串不用+号

this.$route.params.id 截取 (id对应路由参数名)


加个? 有无id值传入都可以跳转

总结 : ?= 的有两种方式传参 (get才有)

直接拼接的也有两种方式

具体看接口设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlXXJvM8-1611224627084)(05-vue新闻移动端项目总结.assets/image-20210102101240545.png)]

7 可通过结构函数赋值data 再渲染

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-13zoed1p-1611224627085)(vue新闻移动端项目总结.assets/image-20201120153825994.png)]

8 编辑页面 (数据回显加修改内容)

1 数据回显 将用户详情赋值页面

2 监听用户修改input框 并赋值给data里的属性 上面页面子组件属性: 赋值

3 点击修改按钮发送数据 参数是 : 监听后的返回值

9 基础路径

设置路径

赋值时使用

多基准路由

10 拦截系统

1 发送前判定
//  4 拦截系统
axios.interceptors.request.use(config => {
  // 如果自身没有发送headers
  // 本地有存储token
  if (!config.headers.Authorization && localStorage.getItem('token')) {
    // 那就发送token
    config.headers.Authorization = localStorage.getItem('token')
  }
  return config;
}, error => {
  // Do something with request error
  return Promise.reject(error);
});

2 发送后判定

3 执行顺序:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S54hJ8OK-1611224627086)(vue新闻移动端项目总结.assets/image-20201123154140838.png)]

![image-20201123153321378](vue新闻移动端项目总结.assets/image-20201123153321378.png

1 先进vue文件 , 后进拦截器 (左边覆盖右边)*

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UySbugfd-1611224627088)(vue新闻移动端项目总结.assets/image-20201123153943263.png)]

2 res 是相应拦截器 , 后自身vue 文件逻辑* (右边覆盖左边)

4 在发送接口前统一加入token
//  4 请求拦截系统
axios.interceptors.request.use(config => {
  // 如果自身没有发送headers
  // 本地有存储token
  if (!config.headers.Authorization && localStorage.getItem('token')) {
    // 那就发送token
    config.headers.Authorization = localStorage.getItem('token')
  }
  return config;
}, error => {
  // Do something with request error
  return Promise.reject(error);
});

11 路由守卫判定

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEkdkjWv-1611224627089)(05-vue新闻移动端项目总结.assets/image-20210102101728909.png)]

11 不压缩图片显示 object-fit:cover; 平铺

11 vue中@ 查找文件夹名

前提 这个文件夹是唯一的 , 里面只有一个文件可以不写, 如果有多个再后面添加手写 (系统没提示)

12 ForData使用

这是vant iu组件情况下发送

afterRead(fileObj) {
    
    //要先用 FormData 对象将图片转换为二进制形式的数据
    const data = new FormData();
    data.append('file', fileObj.file);
    //回顾 ajax 课程第四天, jQ 上传文件的部分
    
    this.$axios({
        url: '/upload',
        method: 'post',
        headers: {
            Authorization: localStorage.getItem('token')
        },
        data: data
    }).then(res=> {
        console.log(this.$axios.defaults.baseURL + res.data.data.url);
    })
}

<img src="vue新闻移动端项目总结.assets/image-20201124091614738.png" alt="image-20201124091614738" style="zoom:67%;" /

13. 拓展 css 如何穿透 scoped 修改子组件的样式 /deep/

修改第三方子组件样式的方法

  • 最好直接用设计好的属性配置

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgAldbhY-1611224627090)(vue新闻移动端项目总结.assets/image-20200812181552960.png)]

  • 可以查看最终生成的html结构来写 css

  • 如果发现影响不了子组件的样式, 可以考虑是因为 scoped 选项限制了样式的生效范围,

    可以使用 /deep/ 深度选择器 的写法进行穿透

  • 注意事项

    1. 如果是 sass 语法 /deep/ 可能不生效, 使用 >>> / :v-deep 进行替代 (详细找线上文档)
    2. 不要滥用, 不是说让我们考虑哪里添加, 而是当我们遇到问题发现样式影响不了的时候, 再添加

14. 处理文章图片的问题

文章图片问题主要有两种

14.1 没有图片 以及 区分类型

判断在type数据 以及图片数量长度 以此来区分

主要是发布文章的时候没有上传图片,造成 cover是一个空数组

需要进行判断

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RyzdW1rT-1611225109637)(vue新闻移动端项目总结.assets/image-20200628094342910-1606116245191.png]

14.2 图片基准路径不全

后台发出来的数据, 有可能是完整的, 也有可能是不完整的相对路径, 需要拼接 数据库基准路径 baseURL 就像头像一样

需要进行判断

1函数封装

2 全局过滤器

过滤器的作用, 就是将不符合要求的字符串格式化变成我们需要的结果

  • 创建

  • main文件里 拿不到 this 用实例名

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZR5qeo3o-1611224627092)(vue新闻移动端项目总结.assets/image-20201124122009131.png)]

  • 调用

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LN9TDfw3-1611224627093)(vue新闻移动端项目总结.assets/image-20201124122237536.png)]

正则方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jX1uvw8j-1611224627094)(vue新闻移动端项目总结.assets/image-20200628095729308-1606116245191.png)]

15 首页map获取对应数据

1 根据id 发送 获取相对应数据 每次都 请求 渲染

缺点: 监听索引 每次变化也请求渲染

  // 导航栏分类数组[组件激活索引].id
      // 当前分类id
      const currentCategory = this.categoryList[this.active];
      this.$axios({
        method: "get",
        url: "/post/",
        params: {
          category: currentCategory.id,
        },
      }).then((res) => {
        console.log(res);
        this.postList = res.data.data;
      });
    },

2 map改造数据

1: 导航栏数据回来时 往每个item 下增加属性

所以使用map, map本身是一个数组属性

2 新闻数据回来时 将值赋予给新属性 (当前新属性)

要当前属性 否则他不知道将谁来赋值 , 第二次才会获取到!!!

3 当前的属性进行渲染

4 监听变化 只有新属性没有值时才发请求 , 有值就取 临时增加的属性值了

总结 : axios文章发送id 是当前item 的id 第一次渲染封装的函数要在导航栏回来之前, 不然封装函数太快运行

16 分页组件

https://youzan.github.io/vant/#/zh-CN/list

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHFptBxS-1611224627095)(vue新闻移动端项目总结.assets/image-20201126151353655.png)]

1 是否页面初始化加载

2 拉倒底部触发函数

3 List有以下三种状态,理解这些状态有助于你正确地使用List组件:

  • 非加载中,loadingfalse,此时会根据列表滚动位置判断是否触发load事件(列表内容不足一屏幕时,会直接触发)
  • 加载中,loadingtrue,表示正在发送异步请求,此时不会触发load事件
  • 加载完成,finishedtrue,此时不会触发load事件

在每次请求完毕后,需要手动将loading设置为false,表示加载结束

默认为false 是为了 不默认发送完所有数据 每次下拉 触发函数发送

4 turn 是停止运行

17 premise 宏任务 微任务

普通异步宏任务, promise.then 异步 会有vip 特性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xockMgCv-1611224627096)(vue新闻移动端项目总结.assets/image-20201127090214443.png)]

18 ref 操作dom属性

<img src="vue新闻移动端项目总结.assets/image-20201128173145310.png" alt="image-20201128173145310" style="zoom: 80%;" /

19 递归

假设 num=10


在属性上面, 数据从判定条件开始 产生


在属性后面从属性值开始 产生 判定添加结束

练习中

三个文件是借用最后一个来进行渲染 可判定性数据,

而递归是自己调用自己数据 进行渲染

递归渲染 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFPNlJhY-1611224627097)(vue新闻移动端项目总结.assets/image-20201130225944360.png)]
在这里插入图片描述

总结

1 数据遍历 , 把每个itme传子组件 分析

2 如果查找到每个item 里有parent 属性, 那么就把值传给子组件

3 自己调用自己 加上v-if判定条件 将每个item 里有parent 属性进行渲染

注意点 : 1 放上面从最深层开始渲染, 下面最表层渲染

2 调用递归部分单独组件出来, 一起递归会 造成页面错乱 一个box渲染两个item

20 nextTick

好处 相比延时器 不用自己去猜多少毫秒

看情况使用: 它的执行原理是, 先执行方法内除它之外的逻辑 , 再来执行nextTick里的逻辑

21 事件总线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPMxjn1U-1611224627098)(vue新闻移动端项目总结.assets/image-20201201102107145.png[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZpoEjN7-1611224628427)(vue新闻移动端项目总结.assets/image-20201201165004531.png)]]

可解决兄弟, 递归关系传值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFceYGl0-1611224627099)(vue新闻移动端项目总结.assets/image-20201201235124010.png)]

监听后解除绑定

总结 1 创建js文件, 生成事件总线

2 组件引入, 发送 事件名和 数据

3 组件引入, 父级监听事件名 使用数据

4 销毁

22 避免冗余导航到当前位置 捕获错误

全局做法

放入index.js 文件中

const routerPush = VueRouter.prototype.push

VueRouter.prototype.push = function (location) {

 return routerPush.call(this, location).catch(error => error)

}

const router = new VueRouter({
 routes

})

或者局部

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hwKfwI6G-1611224627100)(vue新闻移动端项目总结.assets/image-20201204170727201.png)]

23 插槽

普通插槽 :

为了方便在父组件修改内容

作用域插槽 : 拿到每个item

子组件包住 template

<img src="05-vue新闻移动端项目总结.assets/image-20201212193258834.png" alt="image-20201212193258834" style="zoom: 67%;" /[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VcV22JlH-1611224627101)(05-vue新闻移动端项目总结.assets/image-20201212193438952.png)]

一开一闭之间只有一个dom 就不用template包住

24 from表单的校验

注意点:

​ *1 from表单属性名和rules校验名都要对应
​ 2 form标签要绑定数据 , 有rules校验属性 , 下面prop对应校验方法 , 方法是个数组形式

2 点击 全部校验

给from加 ref 第一个参数成功时 , 第二个是失败的数据地方

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ajq7k4Z0-1611224627102)(vue新闻移动端项目总结.assets/image-20201205224339996.png)]

有 callba 形式 和promise形式 具体看官网

form表单验证 复杂逻辑规定时 validator 自定义校验

25 增删栏目的优化 , 持久化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ky4qoPaZ-1611224627103)(05-vue新闻移动端项目总结.assets/image-20210107135234565.png)]

1 定义两个数组 遍历渲染 点击自身 就增加另一个数组值 删除自身

2 进来页面 首先判定是否本地缓存 有就取 没有就请求获取

3 监听值的变化, 将最新的值储存到浏览器中


26 首页减少不必要的请求,增强性能

首页将文章数据存到本地,并设置时间戳,减少不必要的请求,增强性能

思路 1 tabs 组件具有索引值, 通过索引值来进行默认的渲染

2 通过监听索引值 如果索引值变化, 判定它是不是文章栏目还是 + 号(跳转页面)

如果是栏目 如果文章信息长度为0 就触发函数renderData 不为零就什么都不做 (它就拿之前的数据进行渲染)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U5bhCgQo-1611224627104)(05-vue新闻移动端项目总结.assets/image-20210107134713132.png)]

3 created 判断本地是否有每条栏目, 如果有 就拿 赋值data里属性 没有就发送数据获取

文章内容是根据栏目id来获取的

​ 当前栏目信息 = 所有文章(index)

自身 就增加另一个数组值 删除自身**

2 进来页面 首先判定是否本地缓存 有就取 没有就请求获取

3 监听值的变化, 将最新的值储存到浏览器中

在这里插入图片描述


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值