Vue2的基本内容(二)

news2025/7/22 4:29:59

目录

一、props配置

二、全局事件总线

1.作用

2.原理

3.使用

三、插槽

1.默认插槽

2.具名插槽

3.作用域插槽

 四、Vuex

1.vuex是什么

2.vuex工作流程 

3.vuex的API

(1)state

(2)state辅助函数mapState

(3)mutations

(4)mutations辅助函数mapMutations

(5)actions

(6)actions辅助函数mapActions

(7)getters

(8)getters辅助函数mapGetters

(9)modules

(10)总结

一、props配置

(1)简单声明接收

     props:['name','age','sex']

(2)子组件接收父组件的参数的同时对数据进行类型限制

props:{

      name:String,

      age:Number,

      sex:String

    } 

(3)接收的同时对数据:进行类型限制+默认值的指定+必要性的限制

  props:{

      name:{

        type:String, //name的类型是字符串

        required:true, //name是必要的

      },

      age:{

        type:Number,

        default:99 //默认值

              }

}

二、全局事件总线

1.作用

在 vue 里我们可以通过全局事件总线来实现任意组件之间通信

2.原理

它的原理是给 Vue 的原型对象上面添加一个属性。这样的话我所有组件的都可以访问到这个属性,然后可以通过这个属性来访问其他组件给这个属性上面绑定的一些方法,从而去传递数据。而且这个属性还可以去访问 Vue 实例对象上的方法。因为 Vue 组件构造函数的原型对象的原型对象是指向 Vue 的原型对象的。全局事件总线并不是插件,配置文件等等,事件总线是程序员在做Vue开发中总结积累的一套方法,是一套规则,只要满足这套规则,就可以实现组件间的通信。

3.使用

以下的写法是针对vue2的写法,对vue3的后续会另外总结

(1)main.js中,增加以下代码

//引入Vue
import Vue from 'vue';
//引入App
import App from './App';

//关闭vue的生产提示
Vue.config.productionTip = false

//创建vm
new Vue({
    el: "#app",
    render: h => h(App),
//这个是关键
    beforeCreate() {
        Vue.prototype.$bus = this//安装全局事件总线
    }
})

(2)School.vue 中给 $bus 绑定 hello 事件

<template>
  <div class="school">
    <h2>学校名称:{{ name }}</h2>
    <h2>学校地址:{{ address }}</h2>
  </div>
</template>

<script>
export default {
  name: "School",
  data() {
    return {
      name: "三里屯小学",
      address: "北京"
    }
  },
  mounted() {
    //给$bus绑定hello事件
    this.$bus.$on("hello", (data) => {
      console.log("我是school组件,接收到了数据:" + data);
    })
  },
  beforeDestroy() {
    this.$bus.off("hello")
  }
}
</script>

<style scoped>

</style>

总结:mounted(){
  // 绑定自定义事件
  this.$bus.$on('自定义事件名', (接收参数)=>{
    console.log('我是组件,收到了数据', 接收参数);
  })
}

(3)Student.vue 中触发事件

<template>
  <div class="student">
    <h2>学生姓名:{{ name }}</h2>
    <h2>学生年龄:{{ age }}</h2>
    <button @click="sendStudentName">点我向School组件传递学生姓名</button>
  </div>
</template>

<script>
export default {
  name: "Student",
  data() {
    return {
      name: "张三",
      age: 18
    }
  },
  methods:{
    sendStudentName(){
//这个是关键,发送事件
      this.$bus.$emit("hello",this.name)
    }
  }
}
</script>

<style scoped>

</style>

 总结: methods:{
  // 触发事件,事件名不能重复
  触发事件方法名(){
    this.$bus.$emit('自定义事件名', 传递参数);
  }
}

三、插槽

1.默认插槽

如果我们只在使用组件时的组件标签体内写上内容,那页面上是显示不出来任何东西的,这是因为标签体内的内容确实被解析了,但是vue不知道要把这些东西放在组件中 template 的哪个位置,故我们要在组件的 template 中设置一个插槽来占位,以保证使用组件时其解析的内容可以放入占的位置中去。占位我们使用一个很重要的标签 ------ slot,我们需要在组件的 template 中这样书写:

<template>
   <div>
       <span>我是一个组件,下面是我的插槽内容</span>
       <slot></slot>   //默认插槽
   </div>
</template>

定义一个插槽<slot></slot>

这样使用组件时组件标签体中的内容就可以放入组件的默认插槽中了

2.具名插槽

具名插槽其实只是在默认插槽的基础上给每个插槽起了名字,作用为可以在组件中设置多个插槽,可以更具体细分。首先给组件插槽起名字,使用 name="xxx"

定义一个具名插槽<slot name="center">

3.作用域插槽

作用域插槽就是带有数据的插槽,把组件中的数据绑定给插槽,然后谁使用这个组件谁就能拿到这个数据使用,也相当于一种数据通信,其需要这样把数据绑定定义给组件插槽(名称没有要求)

插槽带数据或方法:<slot :games="games" msg="hello">我是默认的一些内容</slot>

这个里面的games就是将数据绑定给组件插槽,在需要用到这个组件的地方可以接收到这个参数

<template scope="{games}"></template> 

 

 四、Vuex

1.vuex是什么

  • vuex的作用是解决多组件状态共享的问题,在大型的项目中,组件通讯会变得很混乱,使用vuex可以统一管理组件之间的通讯
  • vuex是响应式布局: 只要vuex中的数据变化,对应的组件会自动更新(类似于vue数据驱动)

vuex 是一个状态管理工具,主要解决大中型复杂项目的 数据共享问题,主要包括 state,mutations,actions,getters 和 modules 5 个要 素,主要流程:在页面通过 调用dispatch触发actions执行异步操作,在vue2中,不需要引入useStore,可以直接this.$store.dispatch,vue3最大的特点是按需引入,用到那个api就要引入那个, actions里有默认参数context,在actions通过context.commit(‘给mutations的事件’,‘给mutations的值’)调用mutations,在mutations中的默认参数是state, mutations是唯一修改state的地方

2.vuex工作流程 

我们先触发了Actions中的异步操作,当异步结果出来之后(如果没有异步操作则直接执行后面的操作),我们触发commit调用mutations去修改我们的state,最后因为我们是具有响应式的特点,因此我们的数据被修改成功。

3.vuex的API

(1)state

state提供vuex唯一的公共数据源,所有共享的数据都要统一放到store中的State中存储。

state:{
//在此处写共享属性即可

//准备state——用于存储数据
const state = {
	sum:0 //当前的和
}

 

(2)state辅助函数mapState

将vuex中的数据映射到组件的计算属性中,简化书写操作(写在computed中)

1.导入import { mapState } from 'vuex'

2. ...mapState([‘state中属性名’])

借助mapState生成计算属性,从state中读取数据。(对象写法)

...mapState({he:'sum',xuexiao:'school',xueke:'subject'})

借助mapState生成计算属性,从state中读取数据。(数组写法)

 ...mapState(['sum','school','subject'])

 

 

(3)mutations

state数据的修改只能通过mutations,并且mutations必须是同步的。Mutations是同步更新state数据的唯一方式!!!

  mutations:{

第一个参数是必须的,表示当前的state。

第二个参数是可选的,表示载荷,是可选的。在使用时要传入的数据

专业术语载荷:表示额外的参数
      mutation名(state , 载荷 ) {
  },

mutations:{
JIA(state,value){
		console.log('mutations中的JIA被调用了')
		state.sum += value
	},
	JIAN(state,value){
		console.log('mutations中的JIAN被调用了')
		state.sum -= value
	}
}

 

当我们点击按钮的时候,我们荷载(value)中的数据传到了mutation中随后完成我们的值传递,将我们原始的数据改变。

increment(){
				this.$store.commit('JIA',this.n)
			},
decrement(){
				this.$store.commit('JIAN',this.n)
			},

(4)mutations辅助函数mapMutations

简化书写操作成方法形式(写在methods中)

1.导入import { mapMutations } from 'vuex'

2. ...mapMutations([‘mutations名’])

 

借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)

//第一个为本地方法名,第二个参数为中的方法名

...mapMutations({increment:'JIA',decrement:'JIAN'})

借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(数组写法)

//当本地和index.js中的方法名一致时,可以简化成数组写法

...mapMutations(['JIA','JIAN'])

 

(5)actions

actions: 异步更新我们的数据(例如你的数据来源于ajax)

 actions: {
    // context对象会自动传入,它与store实例具有相同的方法和属性
    action的名字(context, 载荷) {
      // 1. 异步操作获取数据
      // 2. commit调用mutation来修改数据
      // context.commit('mutation名', 载荷)
    }
  }

第一个参数是必须的,表示当前的state。

第二个参数是可选的,表示载荷,是可选的。在使用时要传入的数据

专业术语载荷:表示额外的参数

this.$store.dispath ( 'actions的名字',参数) 

(6)actions辅助函数mapActions

简化书写操作成方法形式(写在methods中)

1.导入import { mapActions } from 'vuex'

2. ...mapmapActions([‘action名’])

借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)

//第一个为本地方法名,第二个参数为actions中的方法名

...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(数组写法)

//当本地和index.js中的方法名一致时,可以简化成数组写法

 ...mapActions(['jiaOdd','jiaWait'])

(7)getters

 getters: {
    计算属性名()(state) {
      return 要返回的值
    }
  }

$store.getters.getter名

 

(8)getters辅助函数mapGetters

同上是简化我们的写法(写在computed中)

1.导入import { mapGetters } from 'vuex'

2. ...mapGetters([‘getters中计算属性’]

 

 借助mapGetters生成计算属性,从getters中读取数据。(对象写法)

  ...mapGetters({bigSum:'bigSum'})

     

 借助mapGetters生成计算属性,从getters中读取数据。(数组写法)

  ...mapGetters(['bigSum'])

 

(9)modules

模块化处理vuex数据,将我们每个模块的vuex数据分开处理

//在我们的store/index.js中书写
 modules: {
      模块名1: {
        // namespaced为true,则在使用mutations时,就必须要加上模块名
          namespaced: true, 

}

}

 export default导出对应的模块

在每个模块必须写上namespaced:true

 

导入模块名

在modules中使用模块

(10)总结

//state
全局的: $store.state.数据项名
模块的: $store.state.模块名.数据项名
//getters
全局的: $store.getters.getter名
模块的: $store.getters['模块名/getters名']
//mutations
全局的: $store.commit('mutations名',载荷) 
模块的: $store.commit('模块名/mutations名',载荷)
//actions
全局的: $store.dispatch('actions名',载荷) 
模块的: $store.dispatch('模块名/actions名',载荷)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/395099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 练习六 (IPC 管道)

文章目录1 标准管道流2 无名管道&#xff08;PIPE&#xff09;3 命名管道&#xff08;FIFO&#xff09;3.1 创建删除管道文件3.2 打开和关闭FIFO文件3.3 管道案例&#xff1a;基于管道的客服端服务器程序使用环境&#xff1a;Ubuntu18.04 使用工具&#xff1a;VMWare workstati…

【C++】STL——string类的模拟实现

文章目录&#x1f449;string类&#x1f448;&#x1f4d5; 概念&#x1f4d5; 成员变量&#x1f4d5; 构造函数、析构函数&#x1f4d5; size() 、getstr() 函数&#x1f4d5; 拷贝构造&#x1f4d5; 赋值重载&#x1f4d5; 迭代器&#x1f4d5; 运算符重载&#x1f4d5; 尾插…

如何管控第三方软件,保护企业数据安全?

日前&#xff0c;密码管理供应商LastPass公布了关于其数据泄露事件的调查新进展。据其透露&#xff0c;这是一起“二次协同攻击”事件。LastPass在2022年8月、12月先后披露的两起违规事件&#xff0c;这两起事件的攻击链有关联。在此次攻击事件中&#xff0c;LastPass发现恶意黑…

王道计算机组成原理课代表 - 考研计算机 第五章 中央处理器 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “中央处理器” 章节知识点总结的十分全面&#xff0c;涵括了《计算机组成原理》课…

C++基础——C++相比C语言的新特性梳理总结(C++新特性、输入输出方式、命名空间namespace)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

论文翻译 | Momentum Contrast for Unsupervised Visual Representation Learning(前三章)

前言&#xff1a; 上一次读恺明大神的文章还是两年前&#xff0c;被ResNet的设计折服得不行&#xff0c;两年过去了&#xff0c;我已经被卷死在沙滩上 Momentum Contrast for Unsupervised Visual Representation Learning 摘要 我们提出了针对无监督表征学习的方法MOCO,利用…

上门按摩预约APP源码-东郊到家源码(开发,PHP,平台搭建)

一、什么是上门按摩预约APP源码&#xff1f; 上门按摩预约APP源码是一款家政服务类型的APP&#xff0c;可以帮忙用户在家就能享受按摩的服务。APP源码分两端&#xff0c;一端是用户端&#xff0c;另外一端是技师端。采用的技术&#xff0c;前端是安卓IOS&#xff0c;后端是PHP&…

java_Day004

1.二维数组 二维数组的创建与初始化&#xff08;java是支持规则数组和不规则数组的&#xff09; 例&#xff1a;int[][] array {{1,2},{2,3}{3,4,5}}; 结构如下&#xff1a; 二维数组的遍历&#xff1a; 例子&#xff1a; Testpublic void test21(){int[][] array new int[…

C++学习记录——십이 vector

文章目录1、vector介绍和使用2、vector模拟实现insert和erase和迭代器失效补齐其他函数深浅拷贝难点思考1、vector介绍和使用 vector可以管理任意类型的数组&#xff0c;是一个表示可变大小数组的序列容器。 通过vector文档来看它的使用。 #include <iostream> #inclu…

集群、分布式的理解

一、单机模式小型系统相对简单&#xff0c;所有的业务全部写在一个项目中&#xff0c;部署服务到一台服务器上&#xff0c;所有的请求业务都由这台服务器处理&#xff0c;这就是单机模式。显然&#xff0c;当业务增长到一定程度的时候&#xff0c;服务器的硬件会无法满足业务需…

强化学习 | 课堂笔记 | 第三课 MP的便利性,随机逼近方法

一、回顾 一、值函数、贝尔曼方程、贝尔曼最优方程 二、最优值函数 三、ADP 3.1 VI 3.2 PI 四、ADP可以使用的条件 五、Q函数 六、解决问题的方案 &#xff08;指的是解决“四 ADP可以使用的条件”中的三个问题&#xff09; 二、期望的计算 一、Markov过程的便利性 1…

新搭建Gitlab代码仓代码如何导入

这里写目录标题一级目录1.本地代码如何导入新Gitlab2.怎么将旧Gitlab代码导入新Gitlab一级目录 1.本地代码如何导入新Gitlab 修改本地代码 .git 目录下面的config 文件&#xff0c;主要是url参数&#xff0c;将url指向新的Gitlab仓库地址 [core]repositoryformatversion 0f…

【1096. 花括号展开 II】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 如果你熟悉 Shell 编程&#xff0c;那么一定了解过花括号展开&#xff0c;它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串&#xff0c;定…

E900V21C(S905L-armbian)安装armbian-Ubuntu(WiFi)

基本上是s905L芯片的刷机都是如此&#xff0c;包括Q7等 在网上寻找好多的教程关于e900v21c的刷机包和教程都少的可怜&#xff0c;唯一的就是这个&#xff1a;山东联通版创维E900V21C盒子刷入Armbiam并安装宝塔和Docker&#xff0c;但他是不能用WiFi和蓝牙的然后就是寻找s90l的…

C++基础了解-01-基础语法

基础语法 一、基础语法 C 程序可以定义为对象的集合&#xff0c;这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象&#xff0c;方法、即时变量。 对象 - 对象具有状态和行为。例如&#xff1a;一只狗的状态 - 颜色、名称、品种&#xff0c;行为 -…

【LeetCode每日一题】——334.递增的三元子序列

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 贪心算法 二【题目难度】 中等 三【题目编号】 334.递增的三元子序列 四【题…

Vue3视频播放组件(Video)

Vue2视频播放组件 可自定义设置以下属性&#xff1a; 视频文件url&#xff08;videoUrl&#xff09;&#xff0c;必传&#xff0c;支持网络地址https和相对地址 视频封面url&#xff08;videoCover&#xff09;&#xff0c;默认为null&#xff0c;支持网络地址https和相对地…

【nacos2.2.1本地启动】

nacos2.2.1本地启动填坑之行 下载nacos代码 nacos文档地址&#xff1a;https://nacos.io/zh-cn/docs/quick-start-spring.html github地址下载代码&#xff1a;https://github.com/alibaba/nacos.git appllo文章&#xff1a;https://blog.51cto.com/muxiaonong/3933418 下…

UEFI学习(三)-创建一个dxe driver-UDK2017

创建一个dxe driver 创建UEFI DXE driver DXE驱动的运行阶段 DXE驱动创建 创建UEFI DXE driver 在edk2中&#xff0c;我们可以了解到它有非常多种类的模块&#xff0c;每种模块运行于不同阶段&#xff0c;上一阶段&#xff0c;我们尝试了一下标准应用程序的工程模块&#xff0c…

Centos7超详细安装教程

Centos 7适合初入门的带图形化的界面系统安装 本文是基于VMware虚拟机&#xff0c;centos7 64位安装教学 文章目录Centos 7适合初入门的带图形化的界面系统安装一、软件准备二、VMware新建适配虚拟机三、Centos 安装四、基础检查一、软件准备 VMware 虚拟机安装 官网下载链接&…