黑马头条案例

1.手动配置创建带eslintd的vue路由的项目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.初始化:创建并梳理项目结构

在这里插入图片描述
在这里插入图片描述

<template>
  <div>App根组件</div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style lang="less" scoped>
</style>

3.安装和配置Vant组件库

写在前面:一些血泪总结,不要动eslint配置特别是写驼峰命名时候,你就写驼峰命名,文件改删除的删除一个也不要留也不要重命名,index.js路由配置一定要改!!!写之前把原来的删除掉!!!!

🔗 vant组件库

🔗适用于vue2

npm错误——npm ERR! code ERESOLVE 解决方法

在安装组件的时候出现以下问题,npm版本问题报错

在这里插入图片描述

解决方法:在命令后面加上

 npm i vant@latest-v2 -S --legacy-peer-deps

在这里插入图片描述
方法一、自动按需引入组件 但是相当麻烦 所以用方案三

方式三. 导入所有组件

Vant 支持一次性导入所有组件,引入所有组件会增加代码包体积,因此不推荐这种做法。发布时候会有优化。


import Vant from 'vant';
import 'vant/lib/index.css';

Vue.use(Vant);

4.使用Tabbar组件并开启路由模式

注意:给组件起名称时首字母要大写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.通过路由展示对应的Tabbar页面

注意:写的时候会报错
在这里插入图片描述

原因:语法提示的锅

根据官方风格指南,除了根组件(App.vue)外,自定义组件名称应该由多单词组成,防止和html标签冲突。
而最新的vue-cli创建的项目使用了最新的vue/cli-plugin-eslint插件,在vue/cli-plugin-eslint v7.20.0版本之后就引用了vue/multi-word-component-names规则,所以在编译的时候判定此次错误。

解决:在 vue.config.js 中关闭语法提示 【无效】

具体做法:

    // 关闭驼峰命名规则
    'vue/multi-word-component-names': 'off'

🔗 一个好的博客解决办法

最后使用了第二种方法!!/(ㄒoㄒ)/~~弄得麻烦死了 建议直接使用驼峰命名,听话

ESLint 中的“ space-before-function-paren ”相关报错及其解决方案
'space-before-function-paren': ['error', 'never'],

🔗详情链接

userview.vue文件

<template>
  <div class="user-container">
    <!-- 用户基本信息面板 -->
    <div class="user-card">
      <!-- 用户头像、姓名 -->
      <van-cell>
        <!-- 使用 title 插槽来自定义标题 -->
        <template #icon>
          <img src="../../assets/logo.png" alt="" class="avatar" />
        </template>
        <template #title>
          <span class="username">用户名</span>
        </template>
        <template #label>
          <van-tag color="#fff" text-color="#007bff">申请认证</van-tag>
        </template>
      </van-cell>
      <!-- 动态、关注、粉丝 -->
      <div class="user-data">
        <div class="user-data-item">
          <span>0</span>
          <span>动态</span>
        </div>
        <div class="user-data-item">
          <span>0</span>
          <span>关注</span>
        </div>
        <div class="user-data-item">
          <span>0</span>
          <span>粉丝</span>
        </div>
      </div>
    </div>

    <!-- 操作面板 -->
    <van-cell-group class="action-card">
      <van-cell icon="edit" title="编辑资料" is-link />
      <van-cell icon="chat-o" title="小思同学" is-link />
      <van-cell icon="warning-o" title="退出登录" is-link />
    </van-cell-group>
  </div>
</template>

<script>
export default {
  name: 'UserView'
}
</script>

<style lang="less" scoped>
.user-container {
  .user-card {
    background-color: #007bff;
    color: white;
    padding-top: 20px;
    .van-cell {
      background: #007bff;
      color: white;
      &::after {
        display: none;
      }
      .avatar {
        width: 60px;
        height: 60px;
        background-color: #fff;
        border-radius: 50%;
        margin-right: 10px;
      }
      .username {
        font-size: 14px;
        font-weight: bold;
      }
    }
  }
  .user-data {
    display: flex;
    justify-content: space-evenly;
    align-items: center;
    font-size: 14px;
    padding: 30px 0;
    .user-data-item {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      width: 33.33%;
    }
  }
}
</style>

逗号问题

{
            "trailingComma": "none",
            "semi": false,
            "singleQuote": true,
            "arrowParens": "avoid",
            "printWidth": 300
}
在项目根目录新建.prettierrc 文件,添加对象
{
  "semi": false, // 去掉结尾的分号
  "singleQuote": true // 单引号替代双引号
  "trailingComma": "none"// 末尾禁止添加逗号
}
解决 eslint要求函数括号前必须有空格的警告
在.eslintrc.js的rules中添加下面这一行代码
'space-before-function-paren': 0  //解决 eslint要求函数括号前必须有空格的警告
解决eslint提示只能缩进2空格,
在.eslintrc.js的rules中添加下面这一行代码
"editor.detectIndentation": false //  解决eslint提示只能缩进2空格的警告
解决pritter插件自动添加逗号的问题  
在setting.json 中通过ctrl+f全局搜索“editor.formatOnSave” 
// #每次保存的时候自动格式化
    "editor.formatOnSave": true,
 将这一行注释之后就能解决

感天动地!!终于出来了,一定要按照老师的步骤来
在这里插入图片描述

6.初始化-使用NavBar组件

在这里插入图片描述
在这里插入图片描述
新方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.覆盖NavBar的默认样式

在这里插入图片描述

8.了解获取列表数据的API接口

在这里插入图片描述

9.封装utils目录下的request模块

npm i axios -S

–legacy-peer-deps
–legacy-peer-deps标志是在v7中引入的,目的是绕过peerDependency自动安装;它告诉 NPM 忽略项目中引入的各个modules之间的相同modules但不同版本的问题并继续安装,保证各个引入的依赖之间对自身所使用的不同版本modules共存。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import axios from 'axios'

// 调用 axios.create() 函数,创建一个 axios 的实例对象,用 request 来接收
const request = axios.create({
  baseURL: 'https://www.escook.cn'
})

export default request

10.在Home组件中封装initArticleList方法

vue课程接口:
https://applet-base-api-t.itheima.net/articles
同志们 文章最新接口

在这里插入图片描述
在这里插入图片描述

<script>
import request from '@/utils/request.js'

export default {
  name: 'HomeView',
  data() {
    return {
      page: 1,
      limit: 10
    }
  },
  // 在created里面调用它
  created() {
    this.initArticleList()
  },
  methods: {
    // 封装获取文章列表数据的方法
    async initArticleList() {
      const { data: res } = await request.get('/articles', {
        params: {
          _page: this.page,
          _limit: this.limit
        }
      })
      console.log(res)
    }
  }
}
</script>

在home组件中封装了获取数据的方法叫做initArticleList,init代表初始化的意思,建议大家封装前面都用init开头。里面通过requestGet方法请求接口地址,并且把需要的GEt参数通过params对象发送给服务器,这样得到了一个promise实例加await 和async、解构、打印

11.封装articleAPI模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:首先新建用户API模块,要发请求,导入request,定义方法,export const getUserAPI=function(){ return request get(‘/url’,params{})} 一定要加return 否则就是undefined。

12.封装AriticleInfo组件

注意:如果某个数据要在页面上使用,要存到data中去!

<template>
  <div>ArtcleInfo组件</div>
</template>

<script>
export default {
  name: 'AriticleInfo'
}
</script>

<style lang="less" scoped></style>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 // 封装获取文章列表数据的方法
    async initArticleList() {
      const { data: res } = await getArtAPI(this.page, this.limit)
      console.log(res)
      this.artlist = res
    }

在这里插入图片描述

13.AriticleInfo组件封装props属性

样式如下:

.label-box {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.thumb {
  // 矩形黄金比例:0.618
  width: 113px;
  height: 70px;
  background-color: #f8f8f8;
  object-fit: cover;
}

.title-box {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
}

.thumb-box {
  display: flex;
  justify-content: space-between;
}

ArtIINfo.vue 组件中,声明如下的模板结构:

<template>
  <div>
    <van-cell>
      <!-- 标题区域的插槽 -->
      <template #title>
        <div class="title-box">
          <!-- 标题 -->
          <span>文章的标题噢</span>
          <!-- 单张图片 -->
          <img src="https://www.escook.cn/vuebase/pics/1.png" alt="" class="thumb">
        </div>
        <!-- 三张图片 -->
        <div class="thumb-box">
          <img src="https://www.escook.cn/vuebase/pics/2.png" alt="" class="thumb">
          <img src="https://www.escook.cn/vuebase/pics/2.png" alt="" class="thumb">
          <img src="https://www.escook.cn/vuebase/pics/2.png" alt="" class="thumb">
        </div>
      </template>
      <!-- label 区域的插槽 -->
      <template #label>
        <div class="label-box">
          <span>作者 &nbsp;&nbsp; 0评论 &nbsp;&nbsp; 发布日期</span>
          <!-- 关闭按钮 -->
          <van-icon name="cross" />
        </div>
      </template>
    </van-cell>
  </div>
</template>

在这里插入图片描述
小驼峰官方建议修改 cmtCount 为 cmt-count
在使用组件的时候,如果某个属性名是“小驼峰”形式,则绑定属性的时候,建议改写成“连字符”格式。例如: cmtCount 为 cmt-count
在这里插入图片描述

14.为AriticleInfo组件封装cover属性

对象类型的属性要给定默认值,需要指定一个函数,在函数里return一个对象
return 的对象就是 cover 属性的默认值

// 封面的信息对象
    cover: {
      type: Object,
      // 通过 default 函数,返回 cover 属性的默认值
      default: function() {
        // 这个 return 的对象就是 cover 属性的默认值
        return { type: 0 }
      }
    }

在这里插入图片描述

 <!-- 单张图片 -->
          <img :src="cover.images[0]" alt="" class="thumb" v-if="cover.type === 1" />
        </div>
        <!-- 三张图片 -->
        <div class="thumb-box" v-if="cover.type === 3">
          <img :src="item" alt="" class="thumb" v-for="(item, i) in cover.images" :key="i" />
        </div>

在这里插入图片描述

15.上拉加载更多-了解list组件的基本用法

在这里插入图片描述
List 组件通过 loading 和 finished 两个变量控制加载状态,当组件滚动到底部时,会触发 load 事件并将 loading 设置成 true。此时可以发起异步操作并更新数据,数据更新完毕后,将 loading 设置成 false 即可。若数据已全部加载完毕,则直接将 finished 设置成 true 即可。

<van-list
  v-model="loading"
  :finished="finished"
  finished-text="没有更多了"
  @load="onLoad"
>
  <van-cell v-for="item in list" :key="item" :title="item" />
</van-list>

当第一页看完会自动触发load事件,发起下一页数据请求,同时load的值变为true
在这期间,如果用户反复上拉,此时不会多次调用load事件。
因为loading为true时候,不会反复触发load事件

16.上拉加载更多-初步使用list组件

 // 是否正在加载下一页数据,如果 loading 为 true,则不会反复触发 load 事件
 // 每当下一页数据请求回来之后,千万要记得,把 loading 从 true 改为 false
      loading: true,
 // 所有数据是否加载完毕了,如果没有更多数据了,一定要把 finished 改成 true
      finished: false

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

17.上拉加载更多-实现上拉加载更多的效果

在这里插入图片描述
在这里插入图片描述
第一个数据不能被覆盖,而是数据应该拼接!!!!
在这里插入图片描述
写错了!!!!
在这里插入图片描述

如果数据跑完了,应该把finish改为true

 // 封装获取文章列表数据的方法
    async initArticleList() {
      const { data: res } = await getArtAPI(this.page, this.limit)
      // console.log(res)
     
     
      // this.artlist = [旧数据在前, 新数据在后]
      this.artlist = [...this.artlist, ...res]
       this.loading = false
      if (res.length === 0) {
        // 证明没有下一页数据了,直接把 finished 改为 true,表示数据加载完了!
        this.finished = true
      }
    },

在这里插入图片描述

18.下拉刷新-实现下拉刷新的功能

🔗 https://vant-contrib.gitee.io/vant/v2/#/zh-CN/pull-refresh
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
前面refreshing改为isloading!!!

 if (isRefresh) {
        this.artlist = [...res, ...this.artlist]
        this.isLoading = false
      } else {
        this.artlist = [...this.artlist, ...res]
        this.loading = false
      }

在这里插入图片描述
在这里插入图片描述
封装了参数!通过这个此参数进行数据的拼接,拼接完记得改为false

19.定制主题-说明Vant定制主题 的核心原理

在这里插入图片描述

<style lang="less" scoped>
.home-container {
  padding: 46px 0 50px 0;
  .van-nav-bar {
    background-color: #007bff;
  }
  /deep/.van-nav-bar__title {
    color: white;
  }
}
</style>

缺点:换一个页面还是会变成白色的标题

main.js

main.js
// 切记:为了能够覆盖默认的 less 变量,这里一定要把后缀名改为 .less
import 'vant/lib/index.less'

20.定制主题-直接覆盖主题变量

步骤一 引入样式源文件
步骤二 修改样式变量
如果 vue-cli 搭建的项目,可以在 vue.config.js 中进行配置。

点击 空白区域就可以本目录下新建文件 vue.config.js
vue.config.js
这个文件是 vue-cli 创建出来的项目的配置文件
在 vue.config.js 这个配置文件中,可以对整个项目的打包、构建进行全局性的配置

webpack 在进行打包的时候,底层用到了 node.js
因此,在 vue.config.js 配置文件中,可以导入并使用 node.js 中的核心模块

// 这个文件是 vue-cli 创建出来的项目的配置文件
// 在 vue.config.js 这个配置文件中,可以对整个项目的打包、构建进行全局性的配置

// webpack 在进行打包的时候,底层用到了 node.js
// 因此,在 vue.config.js 配置文件中,可以导入并使用 node.js 中的核心模块
const path = require('path')
const themePath = path.join(__dirname, './src/theme.less')

module.exports = {
  publicPath: './',
  css: {
    loaderOptions: {
      less: {
        modifyVars: {
          // 直接覆盖变量
          // 'nav-bar-background-color': 'orange'
          // 或者可以通过 less 文件覆盖(文件路径为绝对路径)
          //  ../    ./    theme.less
          // 从盘符开始的路径,叫做绝对路径   C:\\Users\liulongbin\\theme.less
          hack: `true; @import "${themePath}";`
        }
      }
    }
  }
}

只要修改了配置文件,都得重启服务器!!!!
缺点:这种方案【直接覆盖变量】—需要重启服务器,太麻烦了!!!!!

less是可编程的样式语言!!!!

21.定制主题-通过theme.less定制主题-推荐形式

 // 或者可以通过 less 文件覆盖(文件路径为绝对路径)
 hack: `true; @import "your-less-file-path.less";`,
// 在 src/theme.less 文件中,覆盖 Vant 官方的 less 变量值
@blue: #007bff;

// 覆盖 Navbar 的 less 样式
@nav-bar-background-color: @blue;
@nav-bar-title-text-color: #fff;
// vue.config.js
const path = require('path')
const themePath = path.join(__dirname, './src/theme.less')
module.exports = {
  css: {
    loaderOptions: {
      less: {
        // 若 less-loader 版本小于 6.0,请移除 lessOptions 这一级,直接配置选项。
        lessOptions: {
          modifyVars: {
            // 或者可以通过 less 文件覆盖(文件路径为绝对路径)
            hack: `true; @import "${themePath}";`
          }
        }
      }
    }
  }
}

22END

默认打包生成的dist文件只能发布到服务器上通过http协议才能被打开,双击是file协议。
发布的配置: publicPath: ‘’,

🔗配置

import引入js报错:Access to script at ‘file:///E:/…‘ from origin ‘null‘ has been blocked by CORS policy

在VSCode中安装live server插件:

在index.html文件中右键:“Open with Live Server”,正常输出结果:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue黑马头条项目的难点主要包括以下几个方面: 1. 数据流管理:在Vue黑马头条项目中,需要管理大量的数据,包括用户信息、新闻内容、评论等。如何有效地处理并管理这些数据,确保数据的正确性和一致性是一个难点。可以使用Vuex来进行全局的数据管理,并通过状态管理模式来统一管理数据的流动和变化。 2. 组件交互与通信:Vue黑马头条项目中使用了大量的组件,组件之间的交互与通信是其中一个难点。组件之间需要进行数据的传递、事件的派发与监听,如何高效地组织和管理这些组件之间的交互,提高项目的可维护性和扩展性是一个挑战。 3. 页面布局和样式:Vue黑马头条项目的页面比较复杂,需要考虑到不同屏幕尺寸的适配和响应式布局。同时,页面中的样式设计也需要符合美观和用户体验的要求。如何在保持页面布局的灵活性和可扩展性的同时,确保页面样式的一致性和用户友好性也是一个难点。 4. 请求与响应处理:Vue黑马头条项目需要与后台进行数据交互,包括获取新闻内容、发布评论等。在请求与响应处理中,需要考虑到网络请求的错误处理、数据的缓存和异步操作的管理等问题,确保用户在使用过程中的流畅性和体验。 5. 性能优化:Vue黑马头条项目中的数据量较大,页面频繁地进行数据的渲染和更新,对页面的性能和响应速度提出了要求。如何通过合理的数据缓存、懒加载、组件按需加载等方式进行性能优化,提高项目的执行效率和用户体验,是一个需要解决的难题。 通过了解和解决这些难点,可以更好地设计和实现Vue黑马头条项目,提高项目的开发效率和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值