Vue2(二)

脚手架开发

在created中发送数据

在mounted中获取焦点  操作dom

局部注册

局部注册只能在当前组件使用 写组件-导入-注册-使用

全局注册

写组件--main.js导入--注册 全局使用

导入多个也可以使用item in xxx :key=item

滚轮加选择 多行选择

ctrl k 0 全部折起来 Ctrl k j

开发思路:

  1. 分析页面 按模块拆分组件,搭架子(局部/全局注册)

  2. 根据设计图 编写html和css

  3. 拆分封装通用小组件(局部/全局注册)

  4. 未来js动态渲染 实现功能

scoped样式只作用于当前组件

组件通信

父传子

子传父this.$emit('事件名’:)

props

可以传递任意数量/任意类型的props

prop类型校验(简单写法最常见)

props更新遵循单向数据流

小黑记事本案例

渲染功能:

  1. 提供数据 -> 提供在公共的父组件 App.vue

  2. 通过父传子 传递给TodoMain

  3. v-for

添加功能

  1. 收集表单数据 -> v-model

  2. 监听事件 (回车+点击)

  3. 子传父,将任务传递给父组件

  4. 添加数据unshift (自己的数据自己出处理)

删除功能

  1. 监听点击事件 删除 携带id

  2. 子传父,传删除的id

  3. 父组件 删除 自己的数据自己处理

底部合计:父传子 渲染

清空功能 子传父 通知父组件 -> 父组件清空

持久化存储-> watch深度监听list的变化->存本地->进页面优先读取

event bus事件总线

对同一事件监听的组件都可以获取到消息

provide reject

不同层组件通信

封装表单组件

应用于输入框 v-model==>:value+@input

v-model="msg1" 等价于 :value="msg1" @input="msg1 = $event.target.value"

① 数据变,视图跟着变 :value

② 视图变,数据跟着变 @input

$event获取事件中的形参 子组件的e.target.value给父组件$event

子组件 BaseSelect 在下拉框值变化时通过 this.$emit('changeId', e.target.value) 向父组件发送选中的城市 ID,父组件通过 @changeId="selectId=$event" 接收并更新 selectId 数据。


封装表单组件 简化版

.sync

自定义v-model不用动要传value

:visible.sync=>:visible + @update:visible

ref和$refs

ref $refs 获取的dom元素/或者组件实例  (当前组件范围内)

ref=“xxx” this.$refs.xxx

nextTick(函数体)

vue异步渲染dom

dom更新完做某件事使用nextTick(函数体)

//1.显示输入框
this.isShowEdit = true
  // 2.输入框获取焦点
  // console.log(this.$refs.inp)  undefined
  this.$nextTick(() => {
   this.$refs.inp.focus()
      })

自定义指令

全局注册

局部注册

指令的值 v-指令名=“指令值”

通过binding.value 可以拿到指令的值;update钩子监听变化实现dom更

封装v-loading

插槽solt

1、组件内slot占位 2.使用组件时传入具体标签内容插入

插槽-后备内容(默认值)

solt标签里面填写内容 使用组件但没传标签或内容就先显示后背内容 若组件内有内容则被覆盖

具名插槽 定向分发

作用域插槽



mytag组件封装案例

1.自动聚焦两种方法

失去焦点 隐藏输入框

回显标签信息

 父组件传递过来的

 v-model实现功能(简化代码) :value+@input

 组件内部通过props接受 :value设置给输入框

回车修改标签信息

 内容修改了 回车 提交标签信息  

 @keyup.enter 触发事件$emit('input',e.target.value)

my-table表格组件的封装案例

* 1.数据不能写死 动态渲染  props 父传子 v-for

* 2.结构不能写死,具名插槽

* 3.表头支持自定义;主体不能写死

还是具名插槽

子组件my-table的数据从父组件传过去 故用自定义插槽传递属性:item和:index给父组件

my-tag 本来用的  <MyTag v-model="tempText"></MyTag>
从父组件到子组件tag 但现在 tag 在table里面 table又回到了父组件 故用table自定义插槽传过来的item的  item又是父组件传递的data里面的item项

父组件 → 子组件(MyTable)传数据 → MyTable 通过作用域插槽将数据项 item 回传给父组件 → 父组件中使用 MyTag 并绑定 item.tag,实现每个商品的独立标签编辑功能。



路由

  1. 下载 233 344 yarn add vue-router@3.6.5  

  2. 引入

  3. 安装注册

  4. 创建路由对象

  5. 注入,将路由对象注入到new Vue 实例中,建立关联


  1. 建组件 导入 配规则

  2. 准备导航链接。配置路由出口(匹配的组件展示的位置)


组件存在目录问题(组件分类)

页面组件、复用组件 都是.vue文件

src/views文件夹 页面组件   页面展示 配合路由使用

src/components 复用组件  展示数据 复用

路由模块封装

rooter-link 取代a标签  

to必须写 to无需# 声明式导航 导航链接

<!-- <a href="#/find">发现音乐</a>

      <a href="#/my">我的音乐</a>
      <a href="#/friend">朋友</a> -->
      <!-- rooter-link 取代a标签  to必须写 to无需# 能高亮 -->
      <router-link to="/find">发现音乐</router-link>
      <router-link to="/my">我的音乐</router-link>
      <router-link to="/friend">朋友</router-link>
      能高亮 .footer_wrap a.router-link-active {
  background-color: purple;
}

两个类名:

router-link-active 模糊匹配  to='/my' 可以匹配 /my /my/a ....

router-link-exact-active 精准匹配 只能匹配 /my

定制这两个类名

跳转传参

1.查询参数传参(适合多个参数)

路由path正常配置

to="/path?参数名=值&参数名2=值"

$route.query.参数名</span></p><p class="ne-p" style="margin-top: 0px; margin-bottom: 0px; padding: 0px; min-height: 24px;"><img src="https://cdn.nlark.com/yuque/0/2025/png/43139252/1751286369084-b533d145-5f9d-47ff-8d83-cfbac9ab8e77.png" width="928.5" title="" id="udd2a9fde" class="ne-image"/></p><h5 style="font-size: 15px; line-height: 24px; margin: 8px 0 5px 0"><span class="ne-text">2.动态路由传参(简介优雅 适合传单个参数)</span></h5><p class="ne-p" style="margin-top: 0px; margin-bottom: 0px; padding: 0px; min-height: 24px;"><span class="ne-text">path:&quot;/path/:参数名&quot; </span></p><p class="ne-p" style="margin-top: 0px; margin-bottom: 0px; padding: 0px; min-height: 24px;"><span class="ne-text">to=&quot;/path/参数值&quot;</span></p><p class="ne-p" style="margin-top: 0px; margin-bottom: 0px; padding: 0px; min-height: 24px;"><span class="ne-text">$route.params.参数名

2*动态路由参数可选符

http://localhost:8080/#/search白屏  未匹配到组件显示空表

/search/:words 表示必须要传参数 。如果不传参数也希望匹配。可以加个可选符 ?

path: '/search:key?   不传参数也可以匹配/search 就不会空白

Vue路由 - 重定向

url路径是/路径 未匹配任何组件,会出现空白

重定向 匹配到path 强制跳转

const router = new VueRouter({
  routes: [
    { path: '/', redirect: '/home' }, //重定向
    { path: '/home', component: Home },
    { path: '/search:key?', component: Search },
  ],
})

Vue路由-404

路由配置最后

路由规则 从上往下匹配

前面都匹配不上 匹配最后一个

{ path: '', component: NotFound },

Vue路由—模式设置

  • hash路由(默认) 例如:http://localhost:8080/#/home

  • history路由(常用) 例如: http://localhost:8080/home (以后上线需要服务器端支持,开发环境webpack给规避掉了history模式的问题) NGINX:location / { try_files $uri $uri/ /index.html; # 核心规则 }

const router = new VueRouter({
  routes: [
    { path: '/', redirect: '/home' },
    { path: '/home', component: Home },
    { path: '/search:key?', component: Search },
    { path: '*', component: NotFound },
  ],
  mode: 'history',
})

编程式导航两种路由跳转方式

通过path路径的传参方式
      this.$router.push('路由路径')
      this.$router.push("/search");
      this.$router.push({
        path: "路由路径",
      });
      this.$router.push({
        path: "search",
      });
name命名路由跳转(path路径长)

编程式导航-路由传参

path路径的传参

query传参 简写-完整

动态路由传参 简写-完整

name命名路由跳转

query传参

动态路由传参

路由案例 面经基础版

  • 一级路由 Layout+ArticleDetail

  • 二级路由Article Collect Like User

  • 请求渲染->跳转传参->组件缓存

嵌套路由

要在一级路由的组件内配置导航出口

实现功能

Article->ArticleDetail

查询参数传参

(更适合多个参数传参)

动态路由传参 (单个参数)

渲染页面

首页空白 重定向处理 redirect: '/article',

返回上一页$router.back()

<nav class="nav"><span
        @click="$router.back()"
        class="back"
      >&lt;</span>

发请求需要时间,点击文章详细后有短暂空白

给ArticleDetailPage加一个v-if=“Article.id” 请求到再渲染

组件缓存 keep-alive

包裹动态组件,缓存不活动的组件实例,而不是销毁他们

抽象组件,自身不会渲染成dom元素,也不会出现在父组件链中

优点:切出去的组件保存在内存中,防止重复渲染dom

减少加载时间及性能消耗,提高用户体验性

问题:所有包裹的都被缓存了,导致数据异常

解决:三个属性

include 组件名数组 匹配的被缓存 优先使用 精确 性能好

exclude 组件名数组 匹配的不背缓存  max 最多可以缓存多少组件实例 性能不好 exclude和max两个配合使用

只希望Layout被缓存 incloud 配置  :incloude="组件名数组"

组件名是Name的属性值,没有配置name属性名才会使用文件名

被缓存组件(LayoutPage)会多两个生命周期

actived 激活时 组件被看见才会触发

deactived失活时 离开组件看不见不会触发

可以在activated(){} 里面放回到首页提示

补充 eslint

规则表 https://zh-hans.eslint.org/docs/latest/rules/

// 当保存的时候,eslint自动帮我们修复错误 
"editor.codeActionsOnSave": { "source.fixAll": true }, 
// 保存代码,不自动格式化 
"editor.formatOnSave": false

<br/>

已有 6 条评论

  1. 新盘首开 新盘首开 征召客户!!!coinsrore.com

  2. 新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!

  3. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  4. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  5. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  6. 华纳圣淘沙公司开户新手教程

    零基础学会(183-8890-9465薇-STS5099)
    华纳圣淘沙公司开户

    华纳圣淘沙公司开户保姆级教程(183-8890-9465薇-STS5099)

    一步步教你开通华纳圣淘沙公司账户(183-8890-9465薇-STS5099)

    华纳圣淘沙公司开户分步图解

    首次开户必看:(183-8890-9465薇-STS5099)
    华纳圣淘沙全攻略

    华纳圣淘沙公司开户实操手册(183-8890-9465薇-STS5099)
    华纳圣淘沙开户流程视频教程

    手把手教学:(183-8890-9465薇-STS5099)
    华纳圣淘沙公司开户

    华纳圣淘沙公司开户完全指南(183-8890-9465薇-STS5099)

发表评论:

陕ICP备2023000669号-1