Vue2 —— 学习(十)

news2024/12/25 13:11:20

一、vue-resource 库

了解即可 在之前的 vue 版本中经常使用 这个库发送 ajax 请求 现在建议使用 axios

我们可以通过使用  vue-resource 库 来实现发送 ajax 请求

它是 vue 的一个插件库

Vue.use() 就能使用我们的插件了

我们引入后去 我们的实例对象 vc 中查看 发现出现了 一个 $http 就是我们引入的东西

然后具体的 使用方法和 axios 一致 把axios 换成 this.$http 即可 用法和 axios 一致

 methods: {
    searchUsers() {
      console.log(this)
      this.$bus.$emit("updataListData", {
        isFirst: false,
        isLoading: true,
        errMsg: "",
        users: [],
      });
      this.$http.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(
        (response) => {
          console.log("请求成功了", response.data.items);
          this.$bus.$emit("getUsers", response.data.items);
          this.$bus.$emit("updataListData", {
            isLoading: false,
            errMsg: "",
            users: response.data.items,
          });
        },
        (error) => {
          console.log("请求失败了", error.message);
          this.$bus.$emit("updataListData", {
            isLoading: false,
            errMsg: error.message,
            users: [],
          });
        }
      );

二、插槽

让父组件可以项子组件指定位置插入 html 结构,也是一种通讯方式,适用于 ===> 子组件

有三类

(一)默认插槽

我们的组件标签 里面可以放图片 但是 vue 解析时不知道 该把这个图片 放在 组件模板中的什么位置,所以我们需要一个插槽来指定位置

Vue 中的模板结构如下

可以把标签写成两边包裹的形式 把要插入的东西放在里面

<template>
  <div class="container">
    <Category title="美食" :listData="foods">
      <img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="" />
    </Category>
    <Category title="游戏" :listData="games" />
    <Category title="电影" :listData="flims" />
  </div>
</template>

然后在组件的模板中 用插槽 slot 来指定插入 的位置 图片就出现了

slot 里面也可以写内容 如果没有人传入东西到 插槽中 就显示我们在 插槽中写的内容 如果有东西传入 就显示我们传入的东西 

<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <slot></slot>
  </div>
</template>

(二)具名插槽

如果有多个插槽的话我们要使用具名插槽

组件中模板

多个 slot 我们直接分别给它们一个 name 属性,分别叫center 和 footer 

<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <slot name="center"></slot>
    <slot name="footer"></slot>
  </div>
</template>

在 app 中的代码 分别指定对应的内容显示到对应的 插槽中去

<Category title="美食">
      <img
        slot="center"
        src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg"
        alt=""
      />
      <a slot="footer" href="">更多美食</a>
    </Category>

 如果是 tempalte 形式的外层标签 可以使用 slot 绑定 也能使用 特殊的绑定方式 就是 v-slot:后面的slot 名不用加 引号包围

<Category title="游戏">
      <template slot="footer">
        <ul>
          <li v-for="(item, index) in games" :key="index">{{ item }}</li>
        </ul>
        <a href="">1223</a>
        <a href="">122</a>
        <a href="">12</a>
      </template>
    </Category>

(三)作用域插槽

数据在组件的自身 根据数据生成的结构需要组件的使用者来决定

如果数据在儿子里面 父亲想拿到儿子里面的数据并进行 插槽操作时 我们可以自己绑定一个变量

games 并将数组games 的数据传入 使用该组件的人 

作用域插槽也能有 name 属性和具名插槽搭配使用

<template>
  <div class="category">
    <h3>{{ title }}分类</h3>
    <slot :games="games">我是默认内容</slot>
  </div>
</template>

然后在app 组件中必须使用 template 标签然后使用 属性 scope 接收 后面的名随便定义

这样接收到了 games 数据 但是是对象的形式 我们需要用 duixiang.games 的方式来遍历数组 

<template>
  <div class="container">
    <Category title="游戏">
      <template scope="duixiang">
        <ul>
          <li v-for="(item, index) in duixiang.games" :key="index">{{ item }}</li>
        </ul>
      </template>
    </Category>
  </div>
</template>

三、vuex

(一)介绍

专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对Vue 应用中多个组件的共享的状态进行集中式的管理也是一种 组件间通信方式,且适用于任意组件通信

集中式就是把所有人都集中起来 然后讲一遍课 

分布式就是 去所有人家每个人都讲一遍课

(二)多组件共享数据

1.通过全局事件总线实现

对 a 中的数据进行读和写,但是使用全局总线时 如果有很多组件的话 需要在所有组件中 使用 $bus$on $bus$emit 很麻烦

2.通过使用 vuex 实现

vuex 不属于任何一个组件 数据直接放在 vuex 中

可以使用 vuex中的api 实现对 vuex 中的数据的读写

(三)使用场景 

共享

1.多个组件依赖同一个状态 就是同一个数据

2.来自不同组件的行为 需要变更同一状态

比如点击数字增加1 滑动数字扩大二十倍 都是对同一个数字生效 就是这个意思

(四)vuex 工作原理

Vuex 里面有三个组成部分 

第一个是 Actions 是行为

第二个 Mutations 是加工维护的意思

第三个 State 状态就是数据 是对象的形式 里面能放很多数据

Vue Components 就是我们写的 vue 组件 Count

dispatch’是一个函数 调用得用两个参数 第一个参数是动作类型 第二个参数是具体的数字dispatch('jia',2) 就是执行加操作 然后加 2 这个函数会引起 actions 里面的函数调用

Actions 响应 是一个对象里面有动作们 { jia:function } 

我们在 加的这个函数中自己调用 commit  函数 commit('jia',2) 然后就进行了提交,然后又调用了multations 里面的加函数

然后就到了 Multations 也是一个对象里面也有 加 函数 {jia:function} 这个函数里面有两个数据 第一个是 state 另一个是 2 然后里面写 state.sum += 2

 State中的状态(数据)就更新了

最后 Render 渲染一下即可

注意: 如果有逻辑的话就是得判断条件 什么条件下才能加 2 的话 ,就不能省略 actions 的过程

如果没有逻辑 直接加 2 就能省略

三个组成部分数据类型都是对象 这三个部分都得经过一个人的领导 就是 store 仓库的意思

(五)vuex 的使用

1.初始化代码 vuex 配置

先安装 npm i vuex@3 不然默认是4版本那是 vue3 使用的

然后引入插件 先 import 再 use

这样是为了 让我们创建 vm 时能配置 store 配置项

不引入就不能配置 store 配置项

引入完 查看 vm,vc 中发现里面有了 $store 属性

import Vue from 'vue'
import App from './App.vue'
import vueResource from 'vue-resource'
import Vuex from 'vuex'
Vue.config.productionTip = false
Vue.use(vueResource)
Vue.use(Vuex)
new Vue({
  el: '#app',
  render: h => h(App),
  beforeCreate() {
    Vue.prototype.$bus = this
  }
})

现在是假的 store 所以我们有两种方法能配置这个store

第一种是 我们在 src 文件夹中创建一个 vuex 文件夹 里面放上 store.js 文件

第二种是 我们在 src 文件夹中创建一个 store 文件夹 里面放上 index.js

推荐使用第二种比较官方

我们在 index.js  文件中进行配置

const actions = {}

用于响应组件中的动作

const mutations ={}

用于操作数据

const state = {}

用于存储数据

最后引入 Vuex 创建并暴露 store  里面得写上三个配置项 actions mutations state 然后用我们上面创建的东西赋值

配置项成功管理起来了

import Vuex from 'vuex'
const actions = {}
const mutations ={}
const state = {}

export default new Vuex.Store({
  actions,
  mutations,
  state
})

 然后去 main.js 中引入  然后配置 store 项 就是自己本身

import Vue from 'vue'
import App from './App.vue'
import vueResource from 'vue-resource'
import Vuex from 'vuex'
import store from './store/index'
Vue.config.productionTip = false
Vue.use(vueResource)
Vue.use(Vuex)
new Vue({
  el: '#app',
  render: h => h(App),
  store,
  beforeCreate() {
    Vue.prototype.$bus = this
  }
})

看上去没啥问题了但是运行会出错 因为我们必须先use (Vuex)再引入 store 才符合规范 所以我们把 use(Vuex)放到 index.js 里面先use 再引入

修正后的代码

index .js 代码

import Vuex from 'vuex'
import Vue from 'vue'
const actions = {}
const mutations = {}
const state = {}
Vue.use(Vuex)
export default new Vuex.Store({
  actions,
  mutations,
  state
})

main.js 代码

import Vue from 'vue'
import App from './App.vue'
import vueResource from 'vue-resource'
import store from './store/index'
Vue.config.productionTip = false
Vue.use(vueResource)

new Vue({
  el: '#app',
  render: h => h(App),
  store,
  beforeCreate() {
    Vue.prototype.$bus = this
  }
})
 2.对vuex 中的数据进行读写

首先把数据 sum:0 写入 state 中存储 

然后写 加法的函数 里面先使用 this.$store.dispath('jia',this.n) 使用加函数然后 加数字 this.n

 increment() {
      this.$store.dispatch('jia',this.n)
    },

然后得调用 vuex里面的 actions 里面的 jia 函数 会有接收到两个参数 第一个是 迷你版的 store 第二个参数就是我们加的数字 这个store 里面有 commit 函数,我们需要在这个 jia函数中再调用 commit 函数 在store 中 最好函数用大写区别一下

const actions = {
  jia(context,value){
    context.commit('JIA',value)
  }
}

然后下一步 在 mutations 里面调用 JIA 函数 该函数也能收到两个参数 第一个是 state 里面有我们的数据 sum 第二个就是我们的要加的数 value

const mutations = {
  JIA(state, value) {
    state.sum += value
  }
}

最后回来改一下模板即可,最后数据就在 $store.state.sum

<h1>当前求和为{{$store.state.sum}}</h1>
3.成型代码

Count.vue 如果 省略了 actions 中的函数 就不用调用 dispatch 函数了 直接使用 commit 函数调用     mutations 中的大写的函数即可

<template>
  <div>
    <h1>当前求和为{{ $store.state.sum }}</h1>
    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
    <button @click="incrementOdd">当前为计奇数再加</button>
    <button @click="incrementWait">等一等再加</button>
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1,
    };
  },
  methods: {
    increment() {
      this.$store.commit("JIA", this.n);
    },
    decrement() {
      this.$store.commit("JIAN", this.n);
    },
    incrementOdd() {
      this.$store.dispatch("jiaOdd", this.n);
    },
    incrementWait() {
      this.$store.dispatch("jiaWait", this.n);
    },
  },
  mounted() {
    console.log("Count", this);
  },
};
</script>
<style>
button {
  margin-left: 5px;
}
</style>

index.js  如果在action中没有业务逻辑的判断 就可以在 actions 中省略 但是有业务逻辑不能省略

import Vuex from 'vuex'
import Vue from 'vue'
const actions = {
  // jia(context, value) {
  //   context.commit('JIA', value)
  // },
  // jian(context, value) {
  //   context.commit('JIAN', value)
  // },
  jiaOdd(context, value) {
    if (context.state.sum % 2)
      context.commit('JIA', value)
  },
  jiaWait(context, value) {
    setTimeout(() => {
      context.commit('JIA', value)
    }, 500)
  },
}
const mutations = {
  JIA(state, value) {
    state.sum += value
  },
  JIAN(state, value) {
    state.sum -= value
  },
}

const state = {
  sum: 0,
}
Vue.use(Vuex)
export default new Vuex.Store({
  actions,
  mutations,
  state
})

四、Vuex 开发者工具的使用

就是我们一直使用的 vue 开发者工具 vuex 和 vue 工具是合并的

选项卡复习

第一个是看组件的 有什么组件

第三个是看自定义事件的

我们使用的是第二个选项卡 切换 vuex 视图

有两块区域 第一块是选择区 第二块是展示区

选择区中选择 显示区中显示我们所选择的东西

每次执行都会显示一次我们执行的过程

显示的是我们的 mutation 中的函数

页面当前呈现的数据就是 现在最下面的绿色

一个小表的符号是时间穿梭 点击就回到之前的状态了

禁止是消除所选中的过程和依赖它的过程

下载按钮是将我们的选中之前的数据合并并且不呈现 全给到基本数据里面了

右上角

红按钮 关闭就不捕获了 我们在页面中进行任何操作都不会被捕获了 一般不关

禁止号是清除所有的现实的数据

注意:要严格根据我们写的流程规范进行代码编写

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

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

相关文章

设计模式之访问者模式(下)

3&#xff09;访问者模式与组合模式联用 1.概述 在访问者模式中&#xff0c;包含一个用于存储元素对象集合的对象结构&#xff0c;可以使用迭代器来遍历对象结构&#xff0c;同时具体元素之间可以存在整体与部分关系&#xff0c;有些元素作为容器对象&#xff0c;有些元素作为…

2024年小程序视频下载教程

现在已经是2024年&#xff0c;还是有很多人不知道如何下载小程序视频&#xff0c;这里就教大家如何下载小程序视频&#xff0c;一共有3种方法 1.录屏 2.利用抓包工具(Fiddler&Charles) 3.利用专门的下载资源工具(下载高手) 我介绍其中的第3种方法 工具我已经打包好了 …

【Linux学习】Linux调试器-gdb使用

这里写目录标题 &#x1f302;背景&#x1f302;gdb使用&#x1f302;指令总结&#xff1a; &#x1f302;背景 程序的发布方式有两种&#xff0c;debug模式和 release模式 其中&#xff0c;debug模式是可以被调试的&#xff0c;到那时release模式是不能被调试的&#xff1b; …

股东减持,营收“四连降”,三只松鼠用什么撑起“百亿”野心?

近日&#xff0c;国内零食品牌三只松鼠&#xff08;SZ:300783&#xff09;发布了2023年业绩报告。从规模效益的层面出发&#xff0c;三只松鼠在高端化和高性价比逻辑下对门店进行了集中优化&#xff0c;虽然营收略有下降&#xff0c;但利润端却实现了强势回暖。 不过&#xff…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

4*5的矩阵(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int result 0;//嵌套循环输出&#xff1b;for (i 1; i < 4; i){//列…

冯喜运:4.22黄金蒋继续“消化超买“,原油回落,通胀担忧缓解?

【 黄金消息面解析】&#xff1a;上周五(4月19日)伊朗媒体似乎淡化了以色列袭击的影响&#xff0c;表明地缘政治风险降低&#xff0c;导致避险资产需求放缓&#xff0c;金价回吐涨幅。上周现货黄金价格上涨超2%。美国黄金期货收盘上涨0.7%&#xff0c;至2413.8美元。从长期来看…

前端开发攻略---合并表格单元格,表格内嵌套表格实现手风琴效果。

1、演示 2、思路 1、用传统的 <table></table> 表格标签来实现比较麻烦。因此通过模拟 表格标签 的写法用<div></div>来实现 2、表头和表格列数是相同的&#xff0c;因此可以确定代码结构 <div class"table"><div class"head…

【Linux 进程间通信】管道(三)

文章目录 1.管道的五种特征2.管道的四种情况 1.管道的五种特征 ①&#x1f34e;匿名管道只能用于有血缘关系的进程之间进行通信&#xff08;爷孙进程之间可以进行通信&#xff09;&#xff0c;常用于父子之间进行通信&#xff1b; ②&#x1f34e;管道内部&#xff0c;自带进…

Mysql的【存储引擎】之【InnoDB】与【MyISAM】的区别

目录 1.存储引擎在 MyISAM 和 InnoDB 有什么区别 2.Mysql 5.7 默认的存储引擎是什么 3.一个简单例子&#xff08;如果非要使用【MyISAM】存储引擎 &#xff09; 4.2009年写的留言板程序的数据&#xff08;存储引擎是&#xff1a;【MyISAM】&#xff09; 5.mysql 8.0 可以使…

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

UV胶水能够粘接丙烯腈-丁二烯-苯乙烯共聚物ABS吗?

UV胶水能够粘接丙烯腈-丁二烯-苯乙烯共聚物ABS吗&#xff1f; UV胶水通常能够用于粘接丙烯腈-丁二烯-苯乙烯共聚物&#xff08;ABS&#xff09;。UV胶水的优势之一是其适用于多种材料的粘接&#xff0c;包括ABS。然而&#xff0c;成功的粘接还取决于一些因素&#xff0c;包括表…

ActiveMQ 如果数据处理出现异常会怎么样

我们有一个 Spring 的客户端&#xff0c;在处理消息的时候因为程序的原因出现消息处理异常。 对这种情况&#xff0c;ActiveMQ 会把出现异常的消息放在 DLQ 队列中进行持久化。 因此&#xff0c;在 ActiveMQ 消息处理队列中需要持续关注 DLQ 队列&#xff0c; DLQ 的队列都是无…

记录好用的python包

记录好用的python包 PipxCentos 安装pipx确保 Pip 被安装更新 Pip安装 Pipx添加 Pipx 到 PATH临时添加到 PATH:永久添加到 PATH: 验证 Pipx 安装 Hatch安装特性 Poetry安装准备工作创建虚拟环境激活虚拟环境安装包追踪 & 更新包常用配置pycharm 远程连接poetry创建的虚拟环…

《QT实用小工具·三十四》Qt/QML使用WebEngine展示的百度ECharts图表Demo

1、概述 源码放在文章末尾 该项目实现了百度ECharts图表的样式&#xff0c;效果demo如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtWebEngine>int main(int argc, ch…

第二证券|炒股如何降低成本?降低成本放大收益!

炒股便是以股票为出资标的&#xff0c;以低价买入、高价卖出的办法赚取差价&#xff0c;其核心内容便是通过证券市场的买入与卖出之间的股价差额获利。那么炒股怎么下降本钱&#xff1f;下面就由第二证券为大家剖析&#xff1a; 炒股怎么下降本钱&#xff1f; 1、股价跌落买进…

8.0 新特性 - RESOURCE GROUP

文章目录 前言1. 应用场景2. 资源组介绍3. 资源组维护4. 资源组的限制 前言 MySQL 是单进程多线程的程序&#xff0c;在 8.0 之前所有的线程优先级都是相同的&#xff0c;并且所有的线程资源都是共享的。8.0 之后推出 RESOURCE GROUP 特性 DBA 可以通过资源组的方式修改线程优…

怎么开通扣款服务(原委托代扣),看这一篇就足够你快速开通自动续费周期扣款了。

一、什么是扣款服务 扣款服务&#xff08;原委托代扣&#xff09;为微信支付为商户和用户提供的&#xff0c;可以在交易场景之外完成支付的能力。委托代扣是指商户取得用户的扣款授权后&#xff0c;向微信支付发起从用户账户扣款至商户账户的扣款指令,微信支付无需验证用户的支…

解开Intel ECI 的面纱

前言 Intel ECI是一个用于工业领域边缘控制的软硬件平台&#xff0c;我们今天主要探索的是软件部分&#xff0c;也就是系统镜像。区别于传统的Ubuntu或者Debian&#xff0c;ECI的强大之处在于它的实时性以及对于Intel自家芯片的缓存优化能力极强。 那么让我们来探索一下 编译…

Access denied for user ‘zabbix‘@‘localhost‘ (using password: NO)

现象 排查过程 进入数据库show grants for zabbixlocalhost;select host,user from mysql.user;cat /etc/zabbix/zabbix_server.conf | grep DB | grep -vE ‘#|$’cat /etc/zabbix/web/zabbix.conf.php | grep DB 解决办法 mysql 8.0以下 DPassword123.com mariadb -e "…