vue2、3复习02-组件的生命周期,父子组件、兄弟组件、后代之间组件的数据共享,vuex,全局配置axious,使用ref引用dom元素,使用ref引用组件的方法,this.$nextTick

2023-10-26

1、组件的运行过程

在这里插入图片描述
声明周期函数:略

2、父子组件中的数据共享

父向子共享数据
子向父共享数据
父子之间双向数据同步

1、父组件向子组件共享数据
父组件通过v-bind属性想子组件共享数据,子组件使用props接收数据

2、子组件向父组件共享数据
自定义事件
触发自定义事件,参见复习1

3、父子组件共享数据
在2的基础上在父组件上使用v-model

3、兄弟组件之间组件中的数据共享

兄弟组件之间实现共享的方案是EventBus,可以借助第三方的包mitt来创建eventBus对象,从而实现兄弟组件之间的数据共享。
在这里插入图片描述
注意,vue3里面生命周期发送变化,created声明周期已经没有了

在这里插入图片描述

  • 1、安装mitt包
npm install mitt --save
  • 2、创建bus对象并导出

eventbus.js

//导入mitt包
import mitt from 'mitt'
//创建eventBus对象
const bus=mitt()

//导出eventbus对象
export default  {
  bus
}

  • 3、创建发送方vue,并用emit发送自定义事件

Send.vue

<template>
  <h3>the sender count is {{count}}</h3>
  <button @click="addCount">addCount</button>
</template>

<script>
  import bus from '../js/eventBus.js'
  export default {
    name: 'Send',
    data(){
      return {
        count:0
      }
    },
    methods:{
      addCount(){
        this.count++
        //通过eventBus来发送事件和数据
        bus.emit('countChange',this.count)
        console.log(bus)
      }
    },

  }
</script>

<style scoped>

</style>

Receiver.vue

<template>
  <div>
    <h3>the Receive number is {{num}}</h3>
  </div>

</template>

<script>
  //导入eventBus模块
  import bus from '../js/eventBus.js'

  export default {
    name: 'Receiver',
    data(){
      return {
        num:0
      }
    },
    created () {
      //接受到send方传递过来的自定义事件,然后处理回调函数的逻辑
      bus.on('countChange',(count)=>{
        //将接受到的事件所带来的参数进行处理
        this.num=count
      })
    },
    methods:{

    }
  }
</script>

<style scoped>

</style>
  • 4、创建接收方vue,并用on接收自定义事件

Receiver.vue

<template>
  <div>
    <h3>the Receive number is {{num}}</h3>
  </div>

</template>

<script>
  //导入eventBus模块
  import bus from '../js/eventBus.js'

  export default {
    name: 'Receiver',
    data(){
      return {
        num:0
      }
    },
    created () {
      //接受到send方传递过来的自定义事件,然后处理回调函数的逻辑
      bus.on('countChange',(count)=>{
        //将接受到的事件所带来的参数进行处理
        this.num=count
      })
    },
    methods:{

    }
  }
</script>

<style scoped>

</style>
  • 5、app.vue导入发送和接收方两个组件
<template>
  <Send></Send>
  <hr/>
  <Receiver></Receiver>

</template>

<script>
import Send from './components/Send.vue'
import Receiver from './components/Receiver.vue'

export default {
  name: 'App',
  data(){
    return {

    }
  },
  methods:{

  },

  components: {
    Send,
    Receiver
  }
}
</script>

<style scoped>

</style>


4、后代关系组件之间的数据共享

后代关系组件之间共享数据,指的是父节点的组件向其子孙组件共享数据,此时组件之间的嵌套关系比较复杂,可以使用provide和inject实现后代关系组件之间的数据共享
谁向外共享数据,谁就使用provide函数
谁接收数据,谁就使用inject函数

- 1、父节点通过provide共享数据

父节点的组件可以通过provide方法,对子孙组件共享数据

 provide(){
      return {
        age:this.age
      }
    },

- 2、子孙节点可以使用inject数组**,**
子孙节点可以使用inject数组,接收父级节点向下共享的数据

export default {
    name: 'Son',
    inject:['age']
  }

ps,这种共享不是即时的共享
完整代码
在这里插入图片描述
1、GrandFather.vue

<template>
  <h3>here is grandfather component,grandfather is {{age}} years old</h3>
  <button @click="changeAge">改变年龄</button>
  <hr/>
  <Father></Father>
</template>

<script>
  import Father from './Father.vue'
  export default {
    name: 'GrandFather',
    data(){
      return{
        age:100
      }
    },
    methods:{
      changeAge(){
        this.age++
      }
    },
    provide(){
      return {
        age:this.age
      }
    },
    components:{
      Father
    }
  }
</script>

<style scoped>

</style>

2、Father.vue

<template>
  <h3>here is Father component</h3>
  <hr/>
  <Son></Son>
</template>

<script>
  import Son from './Son.vue'

  export default {
    name: 'Father',
    components:{
      Son
    }
  }
</script>

<style scoped>

</style>

3、Son.vue

<template>
  <h3>here is Son component,grandfather is {{age}} years old</h3>
</template>

<script>
  export default {
    name: 'Son',
    inject:['age']
  }
</script>

<style scoped>

</style>

4、App.vue

<template>
  <GrandFather></GrandFather>

</template>

<script>
  import GrandFather from './components/GrandFather.vue'
export default {
  name: 'App',
  data(){
    return {

    }
  },
  methods:{

  },

  components: {
    GrandFather

  }
}
</script>

<style scoped>

</style>


5、父节点对外共享响应式数据

父节点使用provide向下共享数据时,可以结合computed汉化书向下共享响应式的数据

  • 1、要从vue导入computed
  • 2、使用computed函数,可以把要共享的数据‘包装’成为响应式的数据
provide(){
      return {
        //使用computed函数,可以把要共享的数据‘包装’成为响应式的数据
        age:computed(()=>this.age)
      }
    },
<template>
  <h3>here is grandfather component,grandfather is {{age}} years old</h3>
  <button @click="changeAge">改变年龄</button>
  <hr/>
  <Father></Father>
</template>

<script>
  import Father from './Father.vue'
  import {computed} from 'vue'
  export default {
    name: 'GrandFather',
    data(){
      return{
        age:100
      }
    },
    methods:{
      changeAge(){
        this.age++
      }
    },
    provide(){
      return {
        //使用computed函数,可以把要共享的数据‘包装’成为响应式的数据
        age:computed(()=>this.age)
      }
    },
    components:{
      Father
    }
  }
</script>

<style scoped>

</style>

6、vuex(以后专章讨论)

vuex是终极的组件之间的数据共享防范,在企业级的vue项目开发中,vuex可以让组件之间的数据共享变得高校、清晰、且易于维护
实际就是有一个数据中心store(消息中心)
react也有类似的机制
在这里插入图片描述

7、全局配置axios

在main.js入口文件中,通过app.config.globalProgerties全局挂载axios,示例代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、ref引用

vue不建议使用jquery
re用来辅助开发者在不依赖jquery的情况下,获取dom元素或组件的应用
每个vue的组件实例上,都包含一个$ref对象,里面存储着对应的DOM元素或组件的引用,默认情况下,组件的$refs指向一个空对象

<template>
  <div>
    <h3>获取refs组件</h3>
    <button @click="getrefs">获取$refs引用</button>
  </div>
</template>

<script>

  export default {
  name: 'App',
  data(){
    return {

    }
  },
  methods:{
    getrefs(){
      console.log(this)
    }
  },

  components: {


  }
}
</script>

<style scoped>

</style>


9、使用ref引用dom元素

如果想要使用ref应用页面上的dom元素,则可以按照以下步骤实现

  • 1、在标签上使用ref属性ref=‘属性名’
  • 2、通过this.$refs属性名来活动dom
  • 3、对dom进行操作

ps:ref还是很方便的,其实vue作为框架应该有一套直接对dom操作的接口

<template>
  <div>
<!--    添加ref属性及属性名-->
    <h3 ref="getRef">获取refs组件</h3>
    <button @click="changStyle">改变样式</button>
  </div>
</template>

<script>

  export default {
  name: 'App',
  data(){
    return {
    }
  },
  methods:{
    changStyle(){
      //通过ref获得dom
      const h3dom=this.$refs.getRef
      //对dom进行操作
      h3dom.style.backgroundColor='red'
    }
  },
  components: {
  }
}
</script>

<style scoped>

</style>
10、使用ref引用页面上组件的实例(如使用组件的方法)

grandfather.vue

<template>
  <h3>here is grandfather component,grandfather is {{age}} years old</h3>
  <button @click="changeAge">改变年龄</button>
  <hr/>
</template>

<script>

  export default {
    name: 'GrandFather',
    data(){
      return{
        age:100
      }
    },
    methods:{
      //自己的一个改变年龄的方法
      changeAge(){
        this.age++
      }
    },
    components:{
    }
  }
</script>

<style scoped>

</style>

app.vue

<template>
  <div>
<!--    添加ref属性及属性名-->
    <GrandFather ref="grandfather"></GrandFather>
    <button @click="useComponentMethod">使用组件上的方法</button>
  </div>
</template>

<script>
  import GrandFather from './components/GrandFather.vue'
  export default {
  name: 'App',
  data(){
    return {

    }
  },
  methods:{
    useComponentMethod(){
      //通过ref获得自定义组件的dom
      const grandfather=this.$refs.grandfather
      //对通过ref获取到的自定义组件上的方法进行调用
      grandfather.changeAge()
    }
  },

  components: {
    GrandFather

  }
}
</script>

<style scoped>

</style>


12、使用this.$nextTick(cb)方法异步更新组件

this.$nextTick(cb)能够将回调函数内部的操作推迟到下次dom更新之后

关键代码:

 methods:{
      changeflag(){
        this.flag=!this.flag
        this.$nextTick(()=>{
          this.$refs.ipt.focus()
        })

      }
    },

完整代码

<template>
  <input type="text" ref="ipt" v-if="flag"/>
  <div>
    <button v-else @click="changeflag">显示</button>
  </div>
  <hr/>
</template>

<script>

  export default {
    name: 'GrandFather',
    data(){
      return{
        flag:true
      }
    },
    methods:{
      changeflag(){
        this.flag=true
        this.$nextTick(()=>{
          this.$refs.ipt.focus()
        })

      }
    },
    components:{
    }
  }
</script>

<style scoped>

</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue2、3复习02-组件的生命周期,父子组件、兄弟组件、后代之间组件的数据共享,vuex,全局配置axious,使用ref引用dom元素,使用ref引用组件的方法,this.$nextTick 的相关文章

  • Chart.js 刻度线和 X 轴之间的空间

    我正在使用 Chart js 版本 3 x 制作一个简单的画布 它只是显示价格的演变 X 轴用于时间 Y 轴用于进化百分比 我已经成功做到了这一点 但现在 我想添加一些风格 我的目标是在标记刻度和 X 轴之间添加一些空间 我用过chart
  • 如何更改传单弹出窗口的背景颜色?

    我正在使用 Leafletjs 创建地图 我想将弹出窗口 当前显示图像和链接 的背景颜色从白色更改为其他颜色 看起来基本的背景颜色 CSS 语法并不能解决这个问题 有什么建议吗 谢谢 斯科特 调用 leaflet css 后 您可以包含
  • 在 jQuery 中将一列的内容复制到另一列

    下面的 jQuery 非常慢 约 7 秒 我显然做错了 我正在尝试复制列的内容col到专栏0在 HTML 表格中 所以如果 col 是 2 那么我需要将第 2 列复制到第 0 列 for var i 0 i lt 31 i grid tr
  • GWT 与 ScriptSharp 的优缺点 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 CORS 进行 React 中的 Fetch 时出现问题

    我对 CORS 完全陌生 并且遇到以下问题 我正在使用 create react app 端口 3000 调用 spring boot 端口 8080 中创建的一些 REST 服务 我将 JWT 身份验证添加到我的 REST API 中 因
  • 使用 Asynchronous ReadableStream 和 Response 从 Service Worker 的 fetch 事件返回 HTML

    这个问题类似于我的另一个问题 https stackoverflow com questions 62457644 use readablestream with response to return html from fetch eve
  • 在我自己的文件夹结构中的 Sequelize 中的迁移

    我是新来的Sequelize我当前的项目要求我将它与迁移一起使用 我熟悉迁移的内容和方式 我来自Django背景 每个子应用程序在同一文件夹中都有模态 视图 api url 和迁移 我喜欢这个结构 并希望在我的 Nodejs 应用程序中保持
  • 将颜色渐变应用于网格上的材质 - Three.js

    我有一个 STL 文件加载到我的场景中 并将单一颜色应用于 phong 材质 我想要一种方法 将两种颜色应用于该网格物体的材质 并在 Z 轴上应用渐变效果 如下例所示 渐变花瓶 https i stack imgur com Ty9gq j
  • 测试方法的存在性

    我正在尝试使一些现有的 JS 向后兼容 如果一个方法不存在 我需要重写它 否则只返回现有的方法 这是我到目前为止的代码 this grid getDataSource function if getDataSource undefined
  • AJV自定义关键字验证

    我正在使用 AJV 库来验证我的 JSON 架构 我希望能够验证Startdate成为一个字符串 如果不是字符串 则应将其转换为N A 目前 它仅转换undefined to N A 但是 在这些情况下 它不会按预期工作 null gt 空
  • 如何在android中使用webview明智地显示Html内容页面?

    您好 我创建了一个简单的应用程序来在 webview 中显示 html 页面 我使用 webview 并显示页面加载时间 如下所示 此后禁用滚动并使用下一个和上一个按钮来后退和前进包含 所以我的代码如下 首先onCreate显示添加webv
  • 动态创建多个上传文件

    我想知道是否有人知道动态创建上传表单的最佳方法 这就是我想要实现的目标 下面显示的代码允许一次上传 我想要一个按钮 按下该按钮后 应添加另一种形式用于文件上传 因此 如果我想上传 假设有 7 个文件 我想按按钮 7 次来创建这些上传表单 每
  • 查找数组中是否有任何项目符合条件

    我是 JavaScript 新手 现在 我有一个包含多个对象的数组 因此 我想迭代它 如果任何对象与条件匹配 那么我想返回一个值并停止该循环 我的 obj 数组就像 var obj type numberOfQuestions techno
  • 通过 AJAX 加载 Google Maps API,控制台错误

    我正在使用 jquery javascript ajax 和 php 构建一个完全动态的网站 当我单击导航链接时 浏览器会使用 ajax 打开该页面 所以基本上所有页面都加载在同一个index php 中 如果我转到 位置 选项卡 其中有谷
  • Knockout JS 与 Ratchet 和 Push.js 配合得很好,直到我添加数据转换

    我正在使用 Ratchet js push js 库为移动 Web 应用程序创建 UI 在这个库中 链接是通过将要加载的文件 推送 到 content DOM 元素中而不是加载整个页面来处理的 但是 push js 在加载页面时不会加载它找
  • 在 AngularJS 中使用 iFrame

    Using Angular 1 2 我正在尝试找出一种 有角度 的方式来加载 iFrame 但我在任何地方都找不到任何教程 任何真正的讨论 基本上 我有一个显示链接列表的搜索页面 单击链接应调用控制器中的一个函数 该函数将数据 可能通过 h
  • 如何使用 Chart.js 在堆积条形图中显示内联值?

    我正在使用 Chart js 库在堆叠条形图中显示一些值 但我正在努力找出如何显示条形图中的值 即 现在 我有以下代码 可以在条形顶部显示数字 但我想知道如何在条形内部显示它们 var numberWithCommas function x
  • Webpack 和外部库

    我正在尝试 webpack http webpack github io http webpack github io 看起来真的很不错 但我有点被困在这里了 假设我正在为库 f ex jQuery 使用 CDN 然后在我的代码中 我想要r
  • jquery/javascript: function(e){.... e 是什么?为什么需要它?它实际上做了什么/完成了什么?

    myTable click function e var clicked e target clicked css background red 有人可以向我解释一下这一点 并解释为什么需要 e 以及它实际上做了什么 Using e只是一个
  • Google 自定义搜索“热门查询”错误请求错误

    在 Google CSE 中 当我尝试获取Popular Queries 我在FireBug Console 网络错误 400 错误请求 http www google com cse api xxxxxxxxx xxxxxxx cse x

随机推荐

  • 跑深度学习nvidia驱动忽然失效的详细解决方法

    由于经常跑深度学习 所以对于显卡驱动什么的都还是整的比较明白的不含糊 所以都能跑的起来 但是今天跑pytorch框架时 用到cuda 忽然给我报了个错 RuntimeError No CUDA GPUs are available 这给我整
  • 两个非递减顺序表合并成一个非递减顺序表

    两个非递减顺序表合并成一个非递减顺序表 引入 以下这个例题的描述是关于合并两个有序的数组 然后合并之后同样也是一个非递减的顺序排列 但是我名这里讲的不是顺序表 而是封装成一个顺序表 但是我们这里的顺序表其实底层同样是一个数组 所以解题的思路
  • 脚踏实地《数据结构第二章》第一节:线性表的定义和基本操作

    考点分析 一 线性表的定义 数据结构三要素 逻辑结构 定义 线性表是具有相同数据类型的n n gt 0 个数据元素的有限序列 其中n为表长 当n 0时线性表是一个空表 相同 每个数据元素所占空间一样大 帮助计算机快速找到某一个具体的元素 序
  • Deepin(Linux)下安装tensorflow-gpu(2019-5-28)

    2019 9 7更新 六 6中安装tensorflow gpu不要采用pip install tensorflow gpu 1 9 直接用conda install channel https conda anaconda org anac
  • Spring MVC案例

    文章目录 Spring MVC 基于XML配置与注解的方式使用Spring MVC 一 创建项目SpringMVCDemo01 二 在pom xml中添加依赖 三 添加项目web功能 四 创建登录页面 登录成功页面 登录失败页面 五 创建登
  • 网安之web攻防第三十天

    知识点 1 数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 2 数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3 数据库Dnslog注入 解决不回显 反向连接 SQL注入 命令执行 SSRF等 4 黑盒模式分析以上 二
  • airpodspro窃听模式_AirPods Pro实时收听怎么关闭? AirPods Pro实时收听的使用方法

    苹果全新AirPods Pro增加了许多新功能 首先 是控制播放 苹果在AirPods Pro中放弃了敲击手势 并用杆上的力传感器取代了它 控制音乐或视频只需要简单的短按即可 一次按压即可播放或暂停当前播放 两次按压将跳至下一曲目 而三次挤
  • 2019-07-11T09:15:41.000+0000类似时间转换

    let a 2019 07 11T09 15 41 000 0000 new Date a
  • (个人)AR电子书系统创新实训第一周(2)

    了解ZXing Net 想要在unity上实现下载资源的功能 我首先需要确认二维码扫描系统在unity上的可行性 如果要自行开发一套二维码扫描系统 不仅需要知道二维码生成和解码的原理 而且应该还需要用到一些图形学相关的代码库 如opencv
  • Android中为layout创建子文件夹

    在开发Android项目的时候 往往都有一大批java文件和layout文件 java文件分类比较简单 直接方法创建文件夹就行 但layout还需要多一步配置 看最后的文件结构图 实现步骤 1 创建相应的文件夹结构 需要注意的是 无论如何
  • ‘float‘ object has no attribute ‘decode‘

    错误代码 weibo df pd read csv Users dl Desktop 情感分析论文 词云图 微博文本数据 原始数据 原数据 表格 微博文本内容 csv print weibo df head 在读取csv或者excel文件时
  • Python基础—文件操作

    Python基础 文件操作 文件操作 文件是指为了重复使用或长期使用的目的 以文本或二进制形式存放于外部存储器 硬盘 U盘 光盘等 中的数据保存形式 文件是信息交换的重要途径 也是利用程序解决实际问题的重要媒介 程序对数据读取和处理都是在内
  • 单片机裸机环境下编写AT指令程序

    1 写在前面 AT指令在各种WIFI模块 2G 4G模块以及一些无线通讯模块中应用广泛 但是用过的朋友都知道 这种方式对于单片机编程来说 并不友好 本篇文章将以ESP8266 WIFI模块为例介绍在单片机裸机环境下编写AT指令程序的一种方式
  • 高精地图在无人驾驶中的应用

    转自 http 36kr com p 5060994 html 编者按 本文来自 程序员 作者 陈辰 刘少山 36氪经授权发布 高精地图是无人驾驶核心技术之一 精准的地图对无人车定位 导航与控制 以及安全至关重要 本文是 无人驾驶技术系列
  • PHP操作Redis LIST ,SET, HASH 的相关命令 (一)

    博客搬家 请访问 PHP操作Redis LIST SET HASH 的相关命令 一 PHP操作Redis KEY String 的相关命令 二 PHP操作Redis 有序集 Sorted Set 的相关命令 三
  • HttpServletRequest.getServletContext()一直提示找不到,而引出的问题

    开发j2ee项目的时候 需要用到servlet api 如果使用了maven web项目可以在pom xml中手动加入所需jar包 达到与依赖j2ee libarary同样的功能 可问题来了 1 问题描述 最近使用myeclipse10 7
  • 2023华为OD机试真题【打印机队列/排序】

    题目内容 有5台打印机打印文件 每台打印机有自己的待打印队列 因为打印的文件内容有轻重缓急之分 所以队列中的文件有1 10不同的代先级 其中数字越大优先级越高 打印机会从自己的待打印队列中选择优先级最高的文件来打印 如果存在两个优先级一样的
  • Struts框架(一)——简介

    引言 Struts 一个web应框架 概述 Struts基于MVC的一个web开源框架 也是一个表示层的框架 只能用于Web项目 内容 一 优缺点 1 优点 1 这是一个开源框架 能让开发人员更深入的了解其内部实现机制和原理 2 框架自带的
  • Spring之AOP的实现

    文章目录 什么是AOP jdk动态代理实现AOP spring实现AOP 什么是AOP AOP Aspect Oriented Programming 意为面向切面编程 我们所熟悉的是面向对象编程 OOP 将程序中所有参与模块都抽象成对象
  • vue2、3复习02-组件的生命周期,父子组件、兄弟组件、后代之间组件的数据共享,vuex,全局配置axious,使用ref引用dom元素,使用ref引用组件的方法,this.$nextTick

    1 组件的运行过程 声明周期函数 略 2 父子组件中的数据共享 父向子共享数据 子向父共享数据 父子之间双向数据同步 1 父组件向子组件共享数据 父组件通过v bind属性想子组件共享数据 子组件使用props接收数据 2 子组件向父组件共