Vue2 —— 学习(十)

一、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 中的函数

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

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

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

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

右上角

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记】RS-Mamba for Large Remote Sensing Image Dense Prediction(附Code)

论文作者提出了RS-Mamba(RSM)用于高分辨率遥感图像遥感的密集预测任务。RSM设计用于模拟具有线性复杂性的遥感图像的全局特征&#xff0c;使其能够有效地处理大型VHR图像。它采用全向选择性扫描模块&#xff0c;从多个方向对图像进行全局建模&#xff0c;从多个方向捕捉大的空间…

大模型系列课程学习-大预言模型微调方法介绍

1.大语言模型相关基本概念综述 语言模型指对语言进行建模&#xff0c;其起源于语音识别(speech recognition)&#xff0c;输入一段音频数据&#xff0c;语音识别系统通常会生成多个句子作为候选&#xff0c;究竟哪个句子更合理&#xff1f; 学术上表达为&#xff1a;描述一段自…

GitHub登录收不到邮箱验证码

由于长时间没有登录GitHub&#xff0c;浏览器可能清除了相应的cookie信息&#xff0c;所以需要对应绑定邮箱进行验证&#xff0c;但因为邮箱长时间没有收到验证码&#xff0c;所以给到以下一种可能解决的方法&#xff1a; 需要输入验证码进行验证 我们可以打开QQ邮箱&#xff0…

Linux——网络管理nmcli

nmcli 不能独立使用&#xff0c;需要对应的服务启动 1. NetworkManager.service 2. 网络配置和服务不相关 3. 通过 nmcl &#xff49; 建立网络配置和网卡之前的映射关系 网卡 简称&#xff1a;nmcli d DEVICE &#xff1a;物理设备 TYPE: 物理设备类型 ethernet 以太网…

【Java基础】25.包(package)

文章目录 前言一、包的作用二、创建包三、import 关键字四、package 的目录结构五、设置 CLASSPATH 系统变量 前言 为了更好地组织类&#xff0c;Java 提供了包机制&#xff0c;用于区别类名的命名空间。 一、包的作用 把功能相似或相关的类或接口组织在同一个包中&#xff…

Android 性能优化之黑科技开道(二)

3. 其它可以黑科技优化的方向 3.1 核心线程绑定大核 3.1.1 定义 核心线程绑定大核的思路也很容易理解&#xff0c;现在的 CPU 都是多核的&#xff0c;大核的频率比小核要高不少&#xff0c;如果我们的核心线程固定运行在大核上&#xff0c;那么应用性能自然会有所提升。 核…

C++相关概念和易错语法(8)(匿名对象、构造+拷贝构造优化、构造析构顺序)

1.匿名对象 当我们实例化对象后&#xff0c;有的对象可能只使用一次&#xff0c;之后就没用了。这个时候我们往往要主动去析构它&#xff0c;否则会占着浪费空间。但是如果遇到大量的这种情况&#xff0c;我们并不想每次都去创建对象、调用、析构&#xff0c;这样会写出很多重…

软考 系统架构设计师系列知识点之大数据设计理论与实践(15)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;14&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.5 常见Kappa架构变型 1. Kappa架构 Kappa是Uber提出的流式数据处理架构&#xff0…

传统与创新的交响:『线上求签祈福』游戏案例赏析

Part1. 设计背景 在当代社会&#xff0c;寺庙文化正经历一场复兴&#xff0c;尤其受到年轻一代的热烈欢迎。无论是在传统的节假日还是平日里&#xff0c;寺庙总是吸引着众多年轻人前来&#xff0c;他们怀着虔诚的心祈求平安健康或财富好运。在面对生活中难以抉择或无法掌控的情…

JAVA-服务器搭建-创建web后端项目

首先打开IDEA 点击新建项目 写好名称-模板选择 Web应用程序 -语言选择 Java 构建系统选择 Maven 然后点击下一步 选择版本-选择依赖项 Web Profile 点击创建 点击当前文件-选择编辑配置 选择左上角的加号-选择Tomcat服务器-选择本地 点击配置-选择到Tomcat目录-点击确定 起个…

创建会计凭证:BAPI_ACC_DOCUMENT_POST 增强字段

创建会计凭证&#xff1a;BAPI_ACC_DOCUMENT_POST 增强字段 在ABAP程序中使用BAPI_ACC_DOCUMENT_POST的时候&#xff0c;如果有些字段在Tables参数中没有&#xff0c;比如&#xff0c;现在大家都用Reason code来作为现金流量表的表现方案。但是在BAPI_ACC_DOCUMENT_POST的acco…

Java新特性(jdk8)

第一章-lambda表达式 1.函数式编程思想和Lambda表达式定义格式 1.面向对象思想: 强调的是找对象,帮我们去做事儿 比如:去北京 -> 强调的是怎么去,火车,高铁,飞机,汽车,自行车,腿儿 2.jdk8开始有了一个新的思想:函数式编程思想: 强调的是结…

FreeRTOS之任务挂起和恢复

1.本文介绍FreeRTOS的任务挂起和恢复函数。任务删除后将不再存在&#xff0c;不能恢复&#xff0c;而任务挂起是暂停任务&#xff0c;可以通过调用函数进行恢复。FreeRTOS任务挂起和恢复的主要步骤如下&#xff1a; &#xff08;1&#xff09;将相关的宏定义设置为1&#xff1…

OPAM模型(细粒度图像分类)

OPAM模型&#xff08;细粒度图像分类&#xff09; 摘要Abstract1. OPAM1.1 文献摘要1.2 细粒度图像分类1.3 研究背景1.4 OPAM模型创新点1.5 OPAM模型1.5.1 补丁过滤1.5.2 显着性提取1.5.3 细粒度区域级注意模型对象-空间约束方法&#xff08;Object spatial constraint&#xf…

钟薛高创始人称卖红薯也把债还上:网友,您可千万别……

网红雪糕品牌钟薛高&#xff0c;是真的网红属性强到让所有消费品牌羡慕。 纵使跌落神坛、纵使站在「破产」边缘&#xff0c;依然话题感满满&#xff0c;隔段时间&#xff0c;总能上一个热搜。 比如欠薪上热搜、产品降价上热搜、甚至官网微博微信停更&#xff0c;也得上个热搜&…

MLLM | InternLM-XComposer2-4KHD: 支持336 像素到 4K 高清的分辨率的大视觉语言模型

上海AI Lab&#xff0c;香港中文大学等 论文标题:InternLM-XComposer2-4KHD: A Pioneering Large Vision-Language Model Handling Resolutions from 336 Pixels to 4K HD 论文地址:https://arxiv.org/abs/2404.06512 Code and models are publicly available at https://gi…

.net core webapi 添加日志管理看板LogDashboard

.net core webapi 添加日志管理看板LogDashboard 添加权限管理&#xff1a; 我们用的是Nlog文件来配置 <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi"http:/…

网络基础-TCP/IP和OSI协议模型

一、OSI和TCP/IP模型 二、OSI七层模型 三、TCP/IP模型 参考&#xff1a;https://www.cnblogs.com/f-ck-need-u/p/7623252.html

Scanpy(1)数据结构和样本过滤

注&#xff1a;主要讲述scanpy处理数据的结构、数据过滤&#xff08;生信领域&#xff09;和数据预处理&#xff08;和机器学习类似&#xff0c;但是又有不同。&#xff09; 1. Scanpy简介与安装 Scanpy 是一个可扩展的工具包&#xff0c;用于分析与 AnnData&#xff08;一种…

螺纹滑牙的原因有哪些——SunTorque智能扭矩系统

螺纹滑牙的原因&#xff0c;通常是由于在旋紧或旋松过程中&#xff0c;螺纹副之间的摩擦力不足以维持所需的预紧力或工作载荷&#xff0c;导致螺纹副的相对位置发生变化。这种现象可能由多种因素引起&#xff0c;包括材料选择不当、设计不合理、制造工艺缺陷、环境因素以及使用…