当前位置: 首页 > news >正文

《Vue 实战:小型项目练手与感悟》

一、Vue 基础与准备

在开始 Vue 项目之前,对 JavaScript、CSS、HTML 基础知识的掌握至关重要。

一、JavaScript 基础知识要求

  1. 数组常用方法
    • filter ():创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
    • map ():返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
    • forEach ():用于调用数组的每个元素,并将元素传递给回调函数。
    • find ():返回通过测试(函数内判断)的数组的第一个元素的值。
    • findIndex ():返回传入一个测试条件(函数)符合条件的数组第一个元素位置。
    • some ():用于检测数组中的元素是否满足指定条件(函数提供)。
    • every ():用于检测数组所有元素是否都符合指定条件(通过函数提供)。
  1. 新标签用法等方面的掌握,在 Vue 项目中也非常重要。例如 Vue2 的过滤器定义及使用,如 findTypeLabel 方法中使用 types.find 查找数组元素;map 方法取数组对象中的某一字段组成新数组;join 方法将数组转化为字符串并用特定符号隔开;filter 方法对数组进行过滤等。

二、CSS 基础知识要求

  1. 定位布局
    • 定位布局是 Vue 项目中常用的布局方式之一。其中,绝对定位是以父元素为基准点进行定位,使用绝对定位时,必须给父元素加定位属性,一般建议使用 position:relative,给子元素加绝对定位 position:absolute 并加上方向属性(top、left、right、bottom)。
    • 标准流是指在不借助任何特殊的 CSS 排列规则元素下的排布规则。标准流中的块级元素独占一行,可设宽高,不设宽度时默认宽度为其父级的 100%;行内元素从左到右排列,不可设置宽高,由其内容决定。浮动和定位会脱离标准流。
    • 浮动布局会对自身、父元素、兄弟元素和子元素产生影响。例如,浮动会使元素变成块元素,可以设置四个方向的 margin;如果父元素没有设置浮动且没有设置高度或高度小于子元素,会造成父元素高度坍塌;设置了浮动的元素会覆盖没有设置浮动的兄弟元素;子元素浮动时会有自适应的效果。清除浮动的方法有 clear:both、overflow:hidden、::after 伪元素等。
  1. Vue 中的 CSS 基础知识还包括类绑定、样式绑定、条件渲染、列表渲染、动态过渡效果、CSS 预处理器支持、CSS 作用域、CSS 模块化、CSS 动画和 CSS 预加载等方面。

三、HTML 基础知识要求

HTML 用于定义网页的结构,在 Vue 项目中,熟悉 HTML 的基本结构和常用标签是基础。例如单标签如 br(换行)、hr(水平线)、img(图片)等;双标签如 h1(标题)、div(容器)、p(段落)、a(链接)等;列表标签如 ul(无序列表)、ol(有序列表)、li(列表项目);表格标签如 table、tr(表格行)、th(表头)、td(表格单元格)等。表单标签如 form(表单区域)、label(文字标注标签)、input(输入标签,有多种属性如单行文本输入框、密码输入框、单选框、复选框等)、textarea(多行文本输入框)、select(下拉列表)等。

这些基础对前端开发的重要性不言而喻,它们为 Vue 项目的开发提供了坚实的基础,使得开发者能够更好地构建用户界面,实现各种功能。

二、Vue 框架实战技巧

1. 生命周期与指令

  1. Vue 生命周期的应用简述:
    • Vue 的生命周期可以分为创建阶段、挂载阶段、更新阶段和销毁阶段。在 created 阶段,实例已经完成了数据观测(data observer),属性和方法的运算,这个阶段可以进行一些异步请求的初始化操作,比如发起 HTTP 请求获取数据。在 mounted 阶段,实例已经完成了虚拟 DOM 的挂载,可以在这个阶段操作 DOM 元素,比如获取 DOM 节点并进行一些操作。在 beforeUpdate 和 updated 阶段,数据更新前后可以进行一些 DOM 操作或者数据处理,但要注意在 updated 阶段不要修改数据,以免陷入死循环。在 beforeDestroy 和 destroyed 阶段,可以进行一些清理操作,比如清除计时器、解绑事件等。
  1. 常用指令及动态指令简述:
    • Vue 常用指令有 v-bind、v-if、v-for、v-model、v-on 等。v-bind 用于绑定元素的属性,可以动态地设置元素的属性值。v-if 用于条件渲染,根据表达式的值决定是否渲染元素。v-for 用于循环遍历数组或对象,生成多个元素。v-model 用于实现双向数据绑定,将表单元素的值与数据模型进行同步。动态指令是指可以根据表达式的值动态地改变指令的行为。例如,可以根据条件动态地绑定不同的类名或属性值。
  1. 修饰符的作用简述:
    • Vue 事件修饰符可以帮助我们更有效地处理事件,同时提高代码的可读性和可维护性。常见的事件修饰符有 .stop、.prevent、.capture、.self、.once 和 .passive。.stop 阻止事件冒泡,相当于 event.stopPropagation()。.prevent 取消预设行为,相当于 event.preventDefault()。.capture 启用事件捕获模式,从外到内进行事件捕获。.self 只有当前元素才能触发事件,即子元素无法触发。.once 事件只触发一次。.passive 与 .prevent 的作用相反,即不阻止默认行为,并且可以提升移动端的性能。

2. 组件设计与通信

  1. 按需加载组件的方式简述:
    • Vue 中实现按需加载组件有以下几种方法:
      • 第一种是使用 vue 官方提供的方式,通过一个组件会打包成一个 js 文件,使用 resolve 和 require 来实现异步加载。例如:const orderList = resolve => require(['../components/orderList.vue'], resolve)。
      • 第二种是使用 ES 提案的 import(),可以指定 webpackChunkName 来将多个组件合并打包成一个文件。例如:const Home = () => import(/* webpackChunkName: 'ImportFuncDemo' */'../components/home')。
      • 第三种是使用 webpack 提供的 require.ensure(),可以实现按需加载,并且可以将多个相同类的组件打包成一个文件,只要给他们指定相同的 chunkName 即可。例如:const Demo = r => require.ensure([], () => r(require('../components/PromiseDemo')), 'pack')。
      • 第四种是对于大型系统项目,可以根据环境变量来配置是否进行懒加载。在开发环境下不进行懒加载,在生产环境下进行懒加载。例如:const _import = require('./_import_' + process.env.NODE_ENV),在加载组件的时候可以这样写:component: _import('permissions/roleindex')。
  1. 组件之间的通信方案简述:
    • Vue 中组件之间的通信方式有很多种,主要包括以下几种:
      • 通过 props 传递:这是父子组件之间通信的常用方式,父组件通过属性传递数据给子组件,子组件通过 props 选项接收数据。
      • 通过 emit` 触发自定义事件,将数据传递给父组件,父组件通过绑定监听器获取数据。
      • 使用 ref:父组件可以通过 ref 来获取子组件的实例,从而访问子组件的数据和方法。
      • 使用 EventBus:全局事件总线是一种适用于任意组件间通信的方式,通过 $emit、$on、$off 发布、监听、关闭事件。
      • 使用 children:子组件可以通过 $parent 访问父组件的方法和数据,父组件可以通过 $children 访问子组件的实例。
      • 使用 attrs 与 listeners:用于祖先传递数据给子辈,$attrs 包含了父级作用域中不作为 prop 被识别、获取的特性绑定,$listeners 包含了父作用域中的事件监听器。
      • 使用 Provide 与 Inject:祖先组件通过 provide 传递数据给子孙组件,子孙组件通过 inject 接收数据。
      • 使用 Vuex:适用于复杂关系的组件数据传递,Vuex 类似于一个存储数据的容器,通过 state、getter、mutations 和 actions 来管理数据。
  1. $event 的用法简述:
    • 在 Vue 中,$event 是一个特殊的修饰符,它允许我们在事件处理函数中访问事件对象。通常与自定义事件一起使用,例如 v-on:click.stop="handleClick($event)"。在父元素和子元素之间,可以通过 $event 来获取触发事件的元素信息,从而进行相应的操作。

3. 工具函数与模拟数据

  1. 常用工具函数总结简述:
    • Vue 项目中常用的工具函数有很多,比如日期格式化函数,可以将日期格式化为特定的字符串格式。还有获取 URL 参数的函数,可以从当前 URL 中获取指定的参数值。
  1. axios 二次封装简述:
    • 对 axios 的二次封装可以包括设置请求拦截器和响应拦截器。在请求拦截器中,可以添加一些公共的请求头信息,或者对请求参数进行处理。在响应拦截器中,可以对响应数据进行统一的处理,比如判断响应状态码,处理错误信息等。
  1. 模拟数据的方法简述:
    • 在 Vue 项目中模拟数据的方法有以下几种:
      • 使用 Mock.js:可以模拟各种数据类型,包括数组、对象、数字等,并且可以设置随机数据生成规则。
      • 自建 json 文件:可以创建一个 json 文件,里面包含模拟的数据,然后在项目中通过异步请求的方式获取这些数据。

三、Vue 项目实战感悟

1. 开发环境与模拟数据

  1. vue-cli 的 externals 设置简述:

externals 是来自于 webpack 的配置项,主要作用是提供了「从输出的 bundle 中排除依赖」的方法。例如,假如有几个项目都使用到了 axios,若不使用 externals,每个项目都会打包一份 axios 到 vendor 中。使用了 externals 之后,可以把 axios 进行外部引入,而 axios 的库文件可以用第三方 cdn 或者放到统一的 cdn 服务器上面。配置方法十分简单:

 

const externals = {

jquery: 'jQuery'

};

module.exports = {

configureWebpack: (config) => {

Object.assign(config, {

externals,

})

};

}

这里要打开 jquery.min.js 的查看 jquery 暴露的全局名称,jquery 的是 jQuery,然后在 index.html 中使用 script 引入就可以了:

 

<script src="https://code.jquery.com/jquery-3.1.0.js" integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk=" crossorigin="anonymous"></script>

  1. 开发过程中的模拟数据简述:

模拟数据在前端开发中经常用到,在后端同事没有完成接口的时候,前端需要自己模拟后端返回数据,提高工作效率。目前接触到的模拟数据方法有几个:

    • Mock.js:Mock.js 应该算最常用的模拟数据库了,通过简单配置即可模拟接口数据。优点在于配置方便快捷,功能相对齐全。缺点是维护 mock.js 的人不多,很多代码已经是几年前的代码。
    • Postman:Postman 中有自带 mock 的功能,配置也非常简单,而且不需要在项目中引入任何额外的库。而这个方法的问题是 Postman mock 的原理是把配置的接口上传到 postman 的服务器,很多公司的项目不希望自己的接口数据被别人知道,安全性不足。
    • 自建 json 文件:自己新建接口返回值对应的 json 文件,代码中判断是开发模式还是生产来切换。好处是所有的数据都能自己配置,不受其他库和平台的约束。不足是需要自己写代码,不够简便。
    • 自建 api 服务器:利用 webpack dev server 使用 express,搭配上 express 可以自建一个 api 服务器。具体操作如下:
 

const { setApi } = require('./mock/api');

// vue.config.js

devServer: {

open: process.platform === 'darwin',

host: '0.0.0.0',

port: 3000,

https: false,

disableHostCheck: true,

before: (app) => {

setApi(app)

},

},

使用 app 实例创建 api 服务器(可以加入 swagger 等等的库,增加 api 服务器的用户体验):

 

//./mock/api.js

const swaggerUi = require('swagger-ui-express');

const submit = require('./submit');

const setApi = (app) => {

const apiData = {

api: [

...cj,...submit,...question,...vote

]

}

const swaggerDocument = {

"swagger": "2.0",

"paths": {

"/pets": {}

}

}

apiData.api.forEach((api) => {

app[api.type](`/api${api.paths}`, (req, res) => {

res.json(api.responses);

});

swaggerDocument.paths[`/api${api.paths}`] = {

[api.type]:

{

tags: [api.tags],

responses: {

[api.responses.statusCode]: {

"description": `successful operation ${JSON.stringify(api.responses)}`

}

}

}

}

});

app.use('/api/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, {

swaggerOptions: {

validatorUrl: null,

}

}));

}

module.exports = { setApi };

 

//./mock/submit.js

module.exports = [

{

type: 'post',

paths: '/submit',

tags: 'submit',

responses: {

statusCode: '200',

data: '',

msg: '提交成功!',

},

},

];

最终效果是请求 http://ip 地址 /api/ 接口名称 可以请求数据,请求 http://ip 地址 /api/docs,可以看到自定义的接口文档。

2. 模块导入与样式处理

  1. 搭配 externals 的模块导入简述:

当我们使用前面说到的 externals 的时候,原则上来说我们不再需要去安装已经设置了 externals 的模块。正如上面的例子,Script 引入了 jquery 之后,我们不需要再 npm i jquery。

  1. 灵活运用双向数据绑定简述:

Vue 双向绑定是指在 Vue 框架中,当数据发生变化时,视图会自动更新,反之亦然。这意味着当用户在界面上修改数据时,相应的 Model 也会自动更新,而当 Model 中的数据发生变化时,视图也会自动更新。在使用双向绑定时,需要注意一些潜在的问题,例如性能优化和数据的一致性。对于大型应用程序或需要处理大量数据的情况,可能需要采用其他更高效的方法来管理数据和视图。总之,Vue 双向绑定简化了数据和视图的同步,提高了开发效率和用户体验。在使用双向绑定时,需要注意一些潜在的问题,并根据具体情况选择适当的方法来管理数据和视图。

四、Vue 小型项目练手案例

1. 适合初学者的练手项目推荐

Vue 是一个流行的前端框架,对于初学者来说,选择合适的练手项目可以帮助他们快速掌握 Vue 的基本概念和开发技巧。以下是一些适合初学者练手的 Vue 小项目推荐:

  • Vue2.0 入门项目:项目地址为 GitHub - SD-Gaming/Vue2.0_to_do_list-addName-: Vue2.0入门项目。这个项目适合刚接触 Vue 的开发者,通过实现一个简单的待办事项列表,学习 Vue 的基本数据绑定、事件处理和组件化开发。
  • 慕课网 Vue2.0 购物车教程 (注释版):GitHub - SD-Gaming/Vue2.0-ShoppingCart-MOOC: 慕课网Vue2.0购物车教程(注释版)。该项目以购物车为例,讲解 Vue 在实际应用中的数据管理和交互设计,对初学者理解 Vue 的状态管理和组件通信很有帮助。
  • 初中级项目:CNode 社区:GitHub - SD-Gaming/Vue2.0_CNode.bbs: 初级项目:CNode社区。这是一个对 CNodeJS 社区的重构项目,适合初学者在实践中掌握 Vue 的路由管理、数据请求和组件化开发。
  • 基于 vue2.0 的网易云音乐播放器:api 来自于 NeteaseCloudMusicApi,项目地址为 http://www.daiwei.org/vue-music/,源码地址为 GitHub - IFmiss/vue-website: :cake: 想用vue把我现在的个人网站重新写一下,新的风格,新的技术,什么都是新的!。通过这个项目,初学者可以学习到如何调用外部 API 以及实现音乐播放功能。
  • Vue 音乐搜索、播放 Demo:GitHub - Sioxas/vue-music: Vue 音乐搜索、播放 Demo。该项目专注于音乐搜索和播放功能,有助于初学者了解 Vue 与音频处理相关的开发技巧。
  • 基于 vue2 + vue-router + vuex 构建的一个音乐类单页面应用 —— echo 回声:liansixin.win,源码地址为 GitHub - uncleLian/vue2-echo: 基于vue2 + vue-router + vuex 构建的一个音乐类单页面应用 —— echo回声。这个项目展示了如何使用 Vue 的全家桶(vue-router、vuex)构建一个复杂的音乐应用,适合有一定基础的初学者进一步提升技能。
  • 基于 vue2 + vue-router + vuex 构建的一个新闻类单页面应用 —— 今日头条(移动端):liansixin.win,源码地址为 GitHub - uncleLian/vue2-news: 基于vue2 + vue-router + vuex 构建的一个新闻类单页面应用 —— 今日头条(移动端)。通过这个项目,初学者可以学习到新闻类应用的开发,包括数据获取、列表展示和路由管理等。
  • Xiaomi Mobile Mall. 小米移动商城:http://show.thisummer.com/mi,源码地址为 GitHub - Jon-Millent/mi-shop: 🌈xiaomi mobile mall.。该项目模拟小米商城的功能,涉及商品展示、购物车等功能,适合初学者练习 Vue 的状态管理和组件通信。
  • 仿网易云 WebApp,基于 vue 实现的 WebAPP:GitHub - tgsx/Web_MusicAPP: 基于vue实现的WebAPP。这个项目让初学者可以深入了解如何实现一个类似网易云音乐的 Web 应用,包括用户界面设计和音乐播放功能。
  • vue+express+socket.io 仿微博、微信的聊天社交平台:GitHub - CBDxin/VueSocial: something like QQ、weibo、weChat(vue+express+socket.io仿微博、微信的聊天社交平台)。通过这个项目,初学者可以学习到实时通信和社交平台的开发,涉及到 Vue 与后端技术的结合。

2. 项目搭建与布局

以 “Vue2.0 入门项目” 为例,介绍 Vue 小项目的搭建过程。

一、环境搭建

  1. 安装 Node.js:Vue 的运行依赖于 Node 的 npm 管理工具。可以在官网(Node.js 中文网)下载适合自己电脑系统的版本,安装完成后在命令行输入node -v,如果能输出版本号,则说明安装成功。
  1. 使用淘宝 npm 镜像:由于在国内使用 npm 速度较慢,推荐使用淘宝的 cnpm 命令管理工具。在命令行输入npm install -g cnpm --registry=https://registry.npm.taobao.org进行安装。
  1. 全局安装 vue-cli 脚手架:安装淘宝镜像后,输入命令cnpm install --global vue-cli,安装完成后输入vue -V查看版本号,确认安装成功。

二、项目创建

  1. 进入项目目录:选择一个合适的目录,进入该目录后在命令行输入vue init webpack 项目名,这里以 “Vue2.0 入门项目” 为例,项目名可以自定义。在创建过程中,会有一些选项需要选择,如 Vue build 可直接回车;Install vue-router 根据需求选择,一般建议选择 Y;Use ESLint to lint your code 对于初学者可以选择 n,不进行 js 语法检测;Set up unit tests 和 Setup e2e tests with Nightwatch 也可以选择 n,暂时不需要这些功能。

三、项目布局

  1. 项目结构:创建完成后,项目文件夹中会包含多个目录和文件。其中,build目录包含构建脚本,如build.js用于生产环境构建,webpack.base.conf.js是 webpack 基本配置等;config目录是项目配置文件,如dev.env.js是开发环境变量配置;node_modules是 npm 加载的项目依赖模块;src目录是开发的主要目录,包含assets(资源目录)、components(组件目录)、router(前端路由配置)、App.vue(根组件)、main.js(入口文件)等。
  1. 组件开发:以 “Vue2.0 入门项目” 为例,可以在components目录下创建自定义组件,如TodoList组件用于展示任务列表,TodoItem组件用于展示单个任务,TodoInput组件用于添加新任务。在App.vue中引入这些组件,进行页面布局。
  1. 数据绑定和事件处理:使用 Vue 的v-model指令实现双向数据绑定,如在输入框中绑定任务内容;使用v-on指令处理添加、删除和标记任务完成等事件。
  1. 路由配置:在router目录下的index.js文件中配置路由路径,实现页面之间的导航。例如,可以配置不同的路由对应不同的组件,实现单页面应用的页面切换效果。

五、Vue 小型项目心得体会

1. UI 框架与组件封装

  1. UI 框架的选择与使用简述:在 Vue 项目中,选择合适的 UI 框架可以极大地提高开发效率。以 element-ui 为例,它具有功能丰富的优点,提供了各种常用的 UI 组件,如表单、导航、表格、按钮、布局等,能够满足大多数 Web 应用的开发需求。同时,它的主题样式丰富,用户可以快速选择合适的主题样式,使 Web 应用的界面更美观,并且文档详细,对每个组件都有详细的使用说明,方便用户快速上手。然而,element-ui 也存在一些缺点,比如体积较大,在应用中引入它会增加项目的体积,对于一些追求性能的应用可能不太适用。而且它不支持单独引入其中的某个组件,如果只需要使用其中的一个组件,那么整个 element-ui 都需要引入,会导致项目体积增大。
  1. 组件封装的灵活把握简述:在 Vue 项目中,组件封装是提高代码可维护性和可复用性的重要手段。何时选择封装组件,何时自己编写,需要根据具体情况来决定。如果某个功能模块在多个地方都可能被用到,并且具有一定的独立性和复杂性,那么封装成组件是一个不错的选择。例如,一个自定义的表格组件,可能在多个页面中都需要展示不同的数据,但表格的样式和交互逻辑是相似的,这时就可以将其封装成组件。而对于一些简单的功能,或者只在特定场景下使用的功能,可以直接在使用的地方编写代码,而不需要封装成组件。总之,要根据功能的复用性、独立性和复杂性来灵活把握组件封装的时机。

2. 目录与请求管理、Vuex 的应用

  1. 目录和 http 请求的管理简述:在 Vue 项目中,对目录和 http 请求进行模块化管理可以提高代码的可维护性和可扩展性。可以在项目中创建一个专门的 http 目录,用于封装 axios 请求方法。例如,可以创建一个 index.js 文件,在其中创建 axios 实例对象,并设置请求拦截器和响应拦截器,对请求和响应进行统一处理。同时,可以创建一个 api.js 文件,统一管理接口地址,方便在项目中进行调用。在 main.js 入口文件中引入封装好的 http 文件,并将其挂载到 Vue 原型上,这样在组件中就可以通过 this.$http 来发送请求。
  1. Vuex 的作用与使用场景简述:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它的作用是解决多组件状态共享的问题,在大型的项目中,组件通讯会变得很混乱,使用 Vuex 可以统一管理组件之间的通讯。Vuex 适用于以下场景:当应用程序的状态需要在多个组件之间共享时;当应用程序的状态需要被频繁修改时;当应用程序的状态需要被集中管理和追踪时;当应用程序的状态变化需要被异步处理时。例如,用户信息(姓名,头像)可能会在很多个地方使用,这时就可以使用 Vuex 来管理用户信息,实现所有组件间的数据共享。

3. 开发技巧与问题解决

  1. name 的使用问题简述:在 Vue 项目中,name 属性在组件中有重要的作用。对于 Vue3,如果在开发中使用了 <script setup>语法,对于组件的 name 属性,需要做一番额外的处理。对于 vue@3.2.34 及以上版本,在使用 <script setup>的单文件组件时,vue 会根据组件文件名,自动推导出 name 属性。也就是名为 MyComponent.vue 或 my-component.vue 的文件,name 属性为 MyComponent,而当在组件内显示定义 name 属性时,会覆盖推导出的名称。组件的 name 属性不仅能用于 <KeepAlive>,而且在使用 vuejs-devtools 插件调试代码的时候,对应组件也能显示出其 name 属性,方便我们快速定位代码和调试。显示的定义 name 属性,是一个好习惯。除此之外,如果我们要在 <script setup>显示定义 name 属性,需要额外添加一个 script,或者使用 unplugin-vue-define-options 来简化操作。
  1. nextTick 的作用是在下次 DOM 更新循环结束之后执行延迟回调。它常见的使用场景有:在数据变化后,需要操作更新后的 DOM 时,可以使用 nextTick 中执行这些操作。另外,在一些异步操作之后,需要确保 DOM 已经更新完毕再进行某些操作时,也可以使用 $nextTick。
  1. key 的妙用简述:在 Vue 项目中,key 属性在列表渲染和虚拟 DOM 对比中有重要的作用。当使用 v-for 循环渲染列表时,给每个列表项添加一个唯一的 key 属性可以帮助 Vue 更高效地更新 DOM。Vue 在对比新旧虚拟 DOM 时,会根据 key 值来判断哪些元素是相同的,哪些是需要更新或删除的。如果没有 key 属性,Vue 可能会进行不必要的重新渲染,导致性能下降。因此,在渲染列表时,应该给每个列表项添加一个唯一的 key 属性,通常可以使用列表项的唯一标识,如 id 等。

六、Vue 小项目开发技巧

1. 项目开发中的实用技巧

  1. 组件的结构与样式简述:
    • 在 Vue 项目中,组件必须有一个根 div,这是为了确保组件有一个明确的根元素,方便 Vue 进行虚拟 DOM 的对比和更新。根 div 可以作为组件的容器,将所有的子元素包含在内。
    • 对于组件的插槽设置样式,可以通过在组件的模板中使用 slot 标签来定义插槽,并在父组件中使用插槽时,通过 CSS 选择器来选择插槽元素进行样式设置。例如,父组件可以使用 /deep/ 或 >>> 来穿透子组件的样式,对插槽元素进行样式设置。同时,也可以在父组件中使用 v-bind 函数在 CSS 中使用 JavaScript 中的变量,实现动态样式设置。
  1. 代码组织方式简述:
    • 在 Vue 项目中,合理组织代码可以提高项目的可维护性和可扩展性。在 created 周期函数中,通常可以进行一些异步请求的初始化操作,比如发起 HTTP 请求获取数据。在 methods 中,可以放置一些与组件交互相关的方法,如事件处理函数、数据操作方法等。
    • 例如,可以将数据获取的方法放在 created 中,当组件实例化时自动调用这些方法获取数据。而在 methods 中,可以定义一些处理数据的方法,如对数据进行过滤、排序等操作。这样可以将数据获取和数据处理分开,使代码结构更加清晰。
  1. 数组操作与数据整合简述:
    • 在 Vue 项目中,对数组的操作方法有很多。可以使用 Vue 提供的数组响应式方法,如 push()、pop()、shift()、unshift()、splice()等,这些方法会触发 Vue 的响应式更新机制,确保视图能够正确地响应数组的变化。
    • 数据整合在 Vue 项目中也非常重要。通过对多个数据源的数据进行整合,可以实现更复杂的业务逻辑。例如,可以将从不同接口获取的数据进行整合,然后在组件中进行展示。同时,数据整合也可以提高代码的可维护性,避免在多个地方重复处理数据。

2. 性能优化与辅助工具

  1. 防抖与懒加载简述:
    • 防抖的概念是在一定时间内,连续触发某个事件,只会执行一次。在 Vue 项目中,防抖可以应用于一些频繁触发的事件,如输入框的输入事件、窗口的 resize 事件等。通过防抖,可以避免频繁触发事件导致的性能问题。
    • 懒加载的作用是在需要的时候才加载资源,如图片、组件等。在 Vue 项目中,可以使用懒加载来提高页面的加载速度。例如,可以使用 vue-lazyload 插件来实现图片的懒加载,当图片进入可视区域时才加载图片。
  1. FastClick 与 Vuex 的辅助函数简述:
    • FastClick 可以解决移动端的点击延迟问题。在移动端,由于浏览器的默认行为,点击事件会有一定的延迟。FastClick 通过在触摸事件和点击事件之间进行拦截和处理,消除了这种延迟,提高了移动端的用户体验。
    • Vuex 中的 mapGetters 辅助函数可以方便地在组件中获取 Vuex 中的 getter。通过 mapGetters,可以将 Vuex 中的 getter 映射到组件的计算属性中,使组件可以直接访问 Vuex 中的状态。例如,可以在组件中使用 computed 属性和 mapGetters 辅助函数来获取 Vuex 中的状态,然后在模板中进行展示。

相关文章:

《Vue 实战:小型项目练手与感悟》

一、Vue 基础与准备 在开始 Vue 项目之前&#xff0c;对 JavaScript、CSS、HTML 基础知识的掌握至关重要。 一、JavaScript 基础知识要求 数组常用方法 filter ()&#xff1a;创建一个新的数组&#xff0c;新数组中的元素是通过检查指定数组中符合条件的所有元素。 map ()&a…...

使用uniapp开发小程序场景:在百度地图上调用接口返回的设备相关信息并展示

首先在百度地图开发者平台注册微信小程序开发密钥下载百度地图SDK-bmap-wx.min.js,下载地址在项目入口index.html页面进行引入页面中进行调用&#xff0c;代码示例如下<map id"map" longitude"108.95" latitude"34.34" scale"3" :m…...

计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

使用 Wireshark 捕获和分析 IEC 60870-5-104 流量基本步骤

一 .IEC 60870-5-104 是什么? IEC 60870-5-104 是一种用于电力系统中数据传输的通信协议&#xff0c;它结合了 IEC 60870-5-101 的应用服务和 TCP/IP 网络协议。该标准定义了一种通过网络连接进行远动控制&#xff08;如遥测、遥控等&#xff09;的方法。 使用 Wireshark 捕…...

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100&#xff0c;默认Value值也为100&#xff0c;默认声音开到最大 这里目前完全由前端控制音量调节&#xff0c;可以直接使用ValueChanged事件实…...

【数据中心建设资料】数据中心安全建设解决方案,数据中心整理解决方案,数据中心如何做到安全保障,数据中台全方案(Word全原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏系统 1.3.8…...

Apache HTTPD多后缀解析漏洞

进入靶场 上来就是一个文件上传的功能 经过尝试&#xff0c;发现只有jpg&#xff0c;png&#xff0c;gif文件能上传上去&#xff0c;而题目又说了&#xff0c;这个是Apache的中间件&#xff0c;Apache文件解析漏洞涉及到一个Apache解析文件的特性&#xff0c;Apache默认一个文…...

html+css+JavaScript实现轮播图

html+css+JavaScript实现轮播图 实现思路 要实现一个轮播图功能,我们需要HTML来构建结构,CSS来设计样式,以及JavaScript来添加交互功能。下面我将分别分析这三个部分是如何协同工作来实现轮播图的。 HTML - 结构 HTML部分定义了轮播图的基本结构,包括图片列表、指示器和…...

Golang 八股(持续补充...)

目录 进程、线程、协程 Go语言——垃圾回收 GC的触发条件 GC调优 GMP调度和CSP模型 Groutine的切换时机 Goroutine调度原理 Goroutine的抢占式调度 Context结构原理 Context原理 Golang内存分配机制 竞态、内存逃逸 golang内存对齐机制 golang中new和make的区别&a…...

MFC实现全屏功能

之前全屏都是参考&#xff1a; MFC单文档&#xff08;SDI&#xff09;全屏程序的实现 主要思路就是将各种菜单工具栏隐藏恢复。 随着MFC的升级&#xff0c;MFC框架本身就具备了全屏的功能。 微软有一个全屏实现类&#xff1a; CFullScreenImpl Class managing full-screen mod…...

AI换脸facefusion 3.0.1安装及其使用方法(源代码安装)

文章目录 1. 本文简介2. 软件环境准备软件下载及安装代码下载 3. Conda环境4. 加速环境5. 依赖安装6. 图片测试 今天给大家分享换脸facefusion 3.0.1使用方法。不仅可以对单张图片换脸&#xff0c;也可以对视频换脸。如果是单张图片的话&#xff0c;没有GPU速度也很快&#xff…...

PCL【C++】点云融合

//图像到点云的转换//C 标准库 #include <iostream> #include <string>//OpenCV 库 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>//PCL 库 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #inclu…...

处理一个MP4视频,检测里面出现的人脸,并根据特征值计算相似度来追踪和显示出每个人脸的ID

使用Mediapipe, opencv 处理一个MP4视频,检测里面出现的人脸,然后使用Mediapipe 计算每个出现的人脸的特征值,并根据特征值计算相似度来追踪和显示出每个人脸的ID import cv2 import mediapipe as mp import numpy as np# 初始化Mediapipe人脸检测和FaceMesh模型 mp_face_de…...

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…...

【WRF-Urban】WPS中有关Urban的变量设置

【WRF-Urban】WPS中有关Urban的变量设置 地理数据源的配置WRF-Urban所需静态地理数据1、LANDUSE&#xff1a;包含城市地表分类的土地利用数据。2、URB_PARAM&#xff1a;城市参数数据集。3、FRC_URB2D&#xff1a;城市覆盖度数据集 WRF默认设置&#xff08;美国&#xff09;数据…...

Android中 ViewPager 和 ViewPager2 的区别

学习笔记 ViewPager 和 ViewPager2 都是 Android 中实现滑动页面效果的控件&#xff0c;用于在一系列页面之间进行切换。ViewPager2 是 ViewPager 的升级版本&#xff0c;提供了更多功能和灵活性。本文将从各个方面详细对比这两个控件&#xff0c;帮助你理解它们的区别和使用场…...

python使用pdfplumber工具包加载pdf格式数据

说在前面 大问题&#xff0c;对于两栏pdf数据&#xff0c;我这边提取出来的数据发现它很离谱。 它居然直接忽略了两栏特性&#xff0c;直接将第1栏的句子拼接上了第2栏的句子 解决方法&#xff1a;pypdf2尝试后可以正确识别两栏数据&#xff0c;非常棒。 示例 pdfplumber代…...

C++设计模式:代理模式(Proxy)(附案例代码)

什么是代理模式&#xff1f; 代理模式是一种结构型设计模式&#xff0c;主要用于为某个对象提供一个代理&#xff0c;以便在不直接访问对象的情况下控制对其的访问。代理可以在客户端和目标对象之间起到一个中介的作用&#xff0c;添加一些额外的操作&#xff0c;例如权限控制…...

Y20030028 JAVA+SSM+MYSQL+LW+基于JAVA的考研监督互助系统的设计与实现 源代码 配置 文档

基于JAVA的考研监督互助系统 1.项目描述2. 课题开发背景及意义3.项目功能4.界面展示5.源码获取 1.项目描述 随着高等教育的普及和就业竞争的加剧&#xff0c;越来越多的学生选择继续深造&#xff0c;参加研究生入学考试。考研人数的不断增加&#xff0c;使得考研过程中的学习监…...

《Java核心技术I》volatile字段

volatile字段 有多处理器的计算机能够暂时在寄存器或本地内存缓存中保存内存值&#xff0c;其结果是&#xff0c;运行在不同处理器上的线程可能看到同一个内存位置上有不同的值。编译器可以改变指令执行的顺序以使吞吐量更大化&#xff0c;编译器不会选择可能改变代码语义的顺…...

使用Hadoop MapReduce进行大规模数据爬取

Hadoop MapReduce概述 Hadoop MapReduce是一个编程模型&#xff0c;用于处理和生成大数据集。它由Map和Reduce两个主要阶段组成。Map阶段负责处理输入数据&#xff0c;并将结果输出为键值对&#xff1b;Reduce阶段则对Map阶段的输出进行汇总和合并&#xff0c;生成最终结果。 …...

git 删除大文件的方法

1 首先 首先要提交所有的更改 git filter-branch -f --prune-empty --index-filter “git rm -rf --cached --ignore-unmatch 文件相对路径复制到这里” --tag-name-filter cat – --all 2 提交 git commit -am “d” git push...

qt数据类型定义(包含签名)

先推荐一个处理markdown表格的网站&#xff0c;超级好用&#xff1a;markdown表格处理&#xff0c;我就是用这个表格处理的excel中的数据上传。 下表整理了数据类型的值范围、签名、qt如何定义等内容。 类型范围/子类型dbus签名qt支持的签名qt类型定义方式转换为variantint8(…...

2025美赛数学建模常用数据库网站大全

优秀模板写作红宝书数学模型获取——更多资料请点击下方名片进群获取。 一、可以查询美国各个领域经济指标的网站: olap.epsnet.com.cnhttps://www.ers.usda.gov/data-products/rice-yearbook/www.ers.usda.govU.S. Energy Information Administration (EIA) www.eia.govhttp…...

Vue 组件通信全面解析

Vue 组件通信全面解析&#xff1a;方式、原理、优缺点及最佳实践 在 Vue 开发中&#xff0c;组件通信是一个重要的核心问题。随着应用复杂度的增加&#xff0c;如何在组件之间有效传递数据、触发事件&#xff0c;直接影响代码的可维护性和可扩展性。Vue 提供了多种组件通信方式…...

node.js基础学习-express框架-路由及中间件(十)

一、前言 Express 是一个简洁、灵活的 Node.js Web 应用框架。它基于 Node.js 的内置 HTTP 模块构建&#xff0c;提供了一系列用于构建 Web 应用程序和 API 的功能&#xff0c;使开发者能够更高效地处理 HTTP 请求和响应&#xff0c;专注于业务逻辑的实现。 其特点包括简单易用…...

书生浦语第四期--基础岛-第六关

文章目录 使用opencompass进行模型评价配置KEY环境变量以及API模型接口配置数据集进行评测开始评测测评结束 使用opencompass进行模型评价 配置KEY环境变量以及API模型接口 配置数据集进行评测 开始评测 期间可能遇到没有下载的包 例如&#xff0c;我遇到了&#xff1a; No m…...

flinkSql中累计窗口CUMULATE

eventTime package com.bigdata.day08;import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;public class _05_flinkSql_Cumulate_eventTime {/*** 累积窗口 eventTime* …...

Flutter项目初始化android版

1、本机系统环境 window11flutter sdk 版本flutter_windows_3.24.5-stable.zip (下载地址&#xff1a;https://docs.flutter.dev/get-started/install/windows/mobile)android studio 版本 Android Studio Giraffe | 2022.3.1vscode 2、VSCODE 配置flutter 安装flutter插件 …...

深度相机获取实时图像总结

问题详情&#xff1a;之前一直把曝光调整到50000&#xff0c;画面一直很流畅&#xff0c;知道领导要求将曝光改成500000时整个程序卡死了 问题解决&#xff1a; 首先怀疑是帧率太低的原因&#xff0c;控制变量后发现不是帧率的问题&#xff0c;看着代码很迷茫&#xff0c;领导…...

突击检查:Java面试之多线程并发篇(11)

前言 本来想着给自己放松一下&#xff0c;刷刷博客&#xff0c;突然被几道面试题难倒&#xff01;什么是多线程中的上下文切换&#xff1f;什么是Daemon线程&#xff1f;它有什么意义&#xff1f;乐观锁和悲观锁的理解及如何实现&#xff0c;有哪些实现方式&#xff1f;似乎有…...

大数据新视界 -- 大数据大厂之 Hive 临时表与视图:灵活数据处理的技巧(上)(29 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

鸿蒙应用获取wifi连接的ip地址(官方文档获取的格式转换成192.168.1.xxx格式)

目录 一.背景 二.官网流程 wifiManager.getLinkedInfo9+ 三.转换成192.168.xxx.xxx格式 一.背景 本次来学习如何获取到鸿蒙设备连接wifi后的ip地址,由于官网文档中获取的ip地址和我们平时看到的192:168:xxx:xxx有所不同,需要进行下转换,所以记录下,如下的流程是在OpenH…...

Elastic Cloud Serverless:深入探讨大规模自动扩展和性能压力测试

作者&#xff1a;来自 Elastic David Brimley, Jason Bryan, Gareth Ellis 及 Stewart Miles 深入了解 Elasticsearch Cloud Serverless 如何动态扩展以处理海量数据和复杂查询。我们探索其在实际条件下的性能&#xff0c;深入了解其可靠性、效率和可扩展性。 简介 Elastic Cl…...

Leetcode经典题5--轮转数组

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 输入输出示例 &#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右…...

【蓝桥杯每日一题】扫雷

扫雷 知识点 2024-12-3 蓝桥杯每日一题 扫雷 dfs &#xff08;bfs也是可行的&#xff09; 题目大意 在一个二维平面上放置这N个炸雷&#xff0c;每个炸雷的信息有$(x_i,y_i,r_i) $&#xff0c;前两个是坐标信息&#xff0c;第三个是爆炸半径。然后会输入M个排雷火箭&#xff0…...

以nlp为例,区分BatchNorm、LayerNorm、GroupNorm、RMSNorm

以nlp中一个小批次数据&#xff0c;详细区分BatchNorm、LayerNorm、GroupNorm、RMSNorm。这几种归一化的不同。如下表格&#xff0c;从计算范围、统计量、计算复杂度以及应用场景等方面的差异给出。 方法计算范围统计量计算复杂度应用场景BatchNorm跨所有句子的同一维度使用批…...

(软件测试文档大全)测试计划,测试报告,测试方案,压力测试报告,性能测试,等保测评,安全扫描测试,日常运维检查测试,功能测试等全下载

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…...

在MySQL中执行sum case when报错:SUM does not exist

1. 报错 在pgsql中能正常运行的一段SQL在MySQL中运行的时候报错了&#xff1a; SELECT DATE( hr.handle_time ) AS statsDate,SUM ( CASE WHEN hma.app_type IN ( 2, 5 ) THEN ch_money ELSE 0 END ) AS aliPayAmt,SUM ( CASE WHEN hma.app_type IN ( 1, 4 ) THEN ch_money EL…...

SQL面试题——日期交叉问题 合并日期重叠的活动

日期交叉问题—合并日期重叠的活动 今天的需求背景和前面我们的一个面试题目的背景一样,只不过是具体的需求变了,可以先看一下我们之前的文章SQL面试题——日期交叉问题 计算活动的总天数 +------+----------+----------+ | id| stt| ett| +------+--------…...

科普文:一文搞懂Postman

1. 概叙 1.1 Postman简介 Postman是一款强大的接口测试工具&#xff0c;‌主要用于测试HTTP请求&#xff0c;‌支持各种HTTP请求方法&#xff0c;‌包括GET、‌POST、‌PUT、‌DELETE等&#xff0c;‌并且提供了丰富的功能来模拟和测试各种网络请求。‌ Postman官网上这样介…...

LearnOpenGL学习(模型加载 -- Assimp,网格,模型)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时&#xff0c;会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息&#xff08;颜色、贴图等&#xff09; Assi…...

基于Pyhton的人脸识别(Python 3.12+face_recognition库)

使用Python进行人脸编码和比较 简介 在这个教程中&#xff0c;我们将学习如何使用Python和face_recognition库来加载图像、提取人脸编码&#xff0c;并比较两个人脸是否相似。face_recognition库是一个强大的工具&#xff0c;它基于dlib的深度学习模型&#xff0c;可以轻松实…...

Scala的模式匹配(2)

package hfdobject Test34_2 {//match case匹配元组//能根据元组元素的个数来匹配&#xff0c;不是一一精确的匹配值def main(args: Array[String]): Unit {val d1(1,2,3) // val d1(1,2,3,4) // val d1(1,2,3,4,5)val d:Anyd1 //d的类型是Anyd match {case (x,y,z)>…...

Java 初学者的第一个 SpringBoot 系统

Java 初学者的第一个 SpringBoot 系统 对编程初学者而言&#xff0c;都存在一个 “第一个系统” 的问题。有些学习者找不到自己的 “第一个系统”&#xff0c;他们即使再努力也没有办法了解完整的系统&#xff0c;即使他们把教科书里的所有程序都跑通了。但是&#xff0c;面对…...

java IO面试题

目录 Java IO设计上使用了什么设计模式&#xff1f; 你怎么理解同步IO和异步IO? 字节流和字符流的区别? Java 流量有多少种类型? 如何将一个 java 将对象序列化到文件中? 如何实现 java 序列化? Filter流是什么? Filter流有哪些可用? 如何实现对象克隆? BIO、…...

Chocolatey软件包管理工具处理MSI升级的原理与实践

Chocolatey软件包管理工具处理MSI升级的原理与实践 在Windows环境下&#xff0c;Chocolatey作为一款强大的包管理工具&#xff0c;其处理MSI&#xff08;Microsoft Installer&#xff09;格式软件包升级的机制值得深入探讨。本文将详细介绍Chocolatey如何处理MSI升级&#xff…...

Navicat连接SQL Server及SpringBoot连接SQL Server(jtds)

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录&#xff0c;找到安装程序&#xff0c;安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接&#xff0c;提示连接成功。 Spr…...

【Git】

博文将不断学习补充 Git下载 将下载链接复制到迅雷中&#xff0c;快速下载 Git安装 保持默认&#xff0c;傻瓜安装即可。 注册Gitee码云&#xff0c;设置公钥 在Git Bash中输入 ssh-keygen -t ed25519 -C "Gitee SSH Key" 找到对应的公钥文件 复制公钥&#xff0c;添…...

HttpServletRequest

HttpServletRequest 类确实是一个封装了完整 HTTP 请求信息的对象&#xff0c;而 Spring MVC 提供了更简化的方式来自动映射请求路径、请求参数等信息到控制器方法中。你不必直接使用 HttpServletRequest 来处理大部分常见的请求内容&#xff0c;因为 Spring MVC 会为你自动处理…...