Vue [Day7]

news2024/10/6 6:50:56

文章目录

  • 自定义创建项目
  • ESlint 代码规范
  • vuex 概述
  • 创建仓库
  • 向仓库提供数据
  • 使用仓库中的数据
    • 通过store直接访问
    • 通过辅助函数 mapState(简化)
    • mutations传参语法(同步
    • 实时输入,实时更新
    • 辅助函数 mapMutations
    • action (异步
    • 辅助函数mapActions
  • getters (类似于计算属性
    • 通过store访问getters
    • 通过辅助函数mapGetters映射
  • 模块module
    • 使用模块中的数据 / 模块中state的访问语法
      • 直接通过模块名访问
      • 通过mapState映射
        • 默认根级别的映射 ...mapState(['user', 'setting'])
        • 子模块映射 mapState('模块名',['xxx]) +开启命名空间
    • 使用模块中getters中的数据 / 模块中getters的访问语法
      • 直接通过模块名访问 $store.getters['模块名/xxx']
      • 通过mapGetters映射
        • 默认根级别映射mapGetters(['xxx'])
        • 子模块映射mapGetters('模块名',['xxx'])+开启命名空间Son2.vue
    • 掌握模块中的mutation调用语法
      • 直接通过store调用 $store.commit('模块名/xxx',额外参数)
      • 通过mapMutations映射
        • 默认根级别映射mapMutations(['xxx'])
        • 子模块映射mapMutations('模块名',['xxx'])+开启命名空间
      • 直接通过模块名访问 $store.dispatch('模块名/xxx',额外参数)
      • 通过mapActions映射
        • 默认根级别映射mapActions(['xxx'])
        • 子模块映射mapActions('模块名',['xxx'])+开启命名空间

自定义创建项目

vue create exp-mobile(项目名

2.选第三个,自定义

3.空格是选中

在这里插入图片描述

4.选vue 2.x
在这里插入图片描述

5.选择哈希

在这里插入图片描述
6.选择Less处理器

在这里插入图片描述
7.选择无分号规范

在这里插入图片描述
8.选择保存时校验
在这里插入图片描述
9.将配置文件放在单独文件中
在这里插入图片描述

小结
在这里插入图片描述

ESlint 代码规范

在这里插入图片描述



vuex 概述

在这里插入图片描述

创建仓库

在这里插入图片描述



store/index.js

// 这里存放的就是vuex相关的核心代码
import Vue from 'vue'
import Vuex from 'vuex'

// 插件安装
Vue.use(Vuex)

// 创建空仓库
const store = new Vuex.Store()

// 导出给main.js
export default store



main.js

import Vue from 'vue'
import App from './App.vue'
import store from './store'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  store //! !!!!
  //   仓库在所有组件都可以访问,用this.$store

}).$mount('#app')



App.vue

 created () {
    console.log(this.$store)
  }


向仓库提供数据






store/index.js

// 创建空仓库
const store = new Vuex.Store({
  // 通过state可以提供数据,所有组件共享的数据,任意组件都可以访问
  state: {
    title: 'hhhhh',
    count: 100
  }
})


使用仓库中的数据

通过store直接访问

在这里插入图片描述




components/Son2.vue

div class="box">
      <h2>Son2 子组件</h2>
      从vuex中获取的值:<label>{{$store.state.count}}</label>
      <br />
      <button>- 1</button>
    </div>


通过辅助函数 mapState(简化)

mapState把store中的数据自动映射到组件的计算属性computed中

computed: {
    ...mapState(['count', 'title'])
  },

在这里插入图片描述



App.vue 节选

<template>
    <div id="app">
      <h1>根组件{{ $store.state.title }}</h1>
      <!-- 3.用了 mapState ,就直接简写 -->
      <h1>根组件{{ title }}</h1>
      <input type="text">
      <Son1></Son1>
      <hr>
      <Son2></Son2>
    </div>
  </template>

<script>
import Son1 from './components/Son1.vue'
import Son2 from './components/Son2.vue'

// 1.导入
import { mapState } from 'vuex'
console.log(mapState(['count', 'title']))

export default {
  name: 'app',
  //   2.展开运算符进行映射
  computed: {
    ...mapState(['count', 'title'])
  },


# 组件(间接)修改仓库数据 mutation

在这里插入图片描述



在这里插入图片描述



store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  strict: true,
  state: {
    title: 'hhhhh',
    count: 100
  },

  // 通过mutations可以提供修改数据的方法
  mutations: {
    // 所有mutations函数,第一个参数,都是state
    addCount (state) {
      state.count++
    }
  }
})

export default store

App.vue

    <span  @click="handleAdd">count</span>      <input type="text">



 methods: {
    handleAdd () {
      // 调用
      this.$store.commit('addCount')
    }
  },


mutations传参语法(同步

提交参数只能有一个,如果有多个参数,包装成一个对象传递
在这里插入图片描述


实时输入,实时更新

不能用v-model,因为vuex是单向数据流
但是v-model 等于 :value @input在这里插入图片描述



App.vue
  <input :value="title" @input="handleInput" type="text">



 handleInput (e) {
      // 1.实时获取输入框的值
      console.log(e.target.value)

      // 2.提交mutation,调用mutation函数
      this.$store.commit('changeTitle', e.target.value)
    }


store/index.js
changeTitle (state, newTitle) {
      state.title = newTitle
    }


辅助函数 mapMutations

把位于mutations中的方法提取出来,映射到methods中
在这里插入图片描述



store/index.js

const store = new Vuex.Store({
  strict: true,
  state: {
    title: 'hhhhh',
    count: 100
  },

  // 通过mutations可以提供修改数据的方法
  mutations: {
    subCount (state, n) {
      state.count -= n
    },
    changeTitle (state, newTitle) {
      state.title = newTitle
    },
    changeCount (state, tt) {
      state.count = tt
    }
  } 

})


Son1.vue

 <button @click="handleSub(10)">- 10</button>
      <button @click="handleSub(20)">- 20</button>
      <button @click="handleSub(30)">- 30</button>

      <!-- 更简单的写法,连外面的函数都不套了 -->
      <button @click="subCount(2)">- 2</button>
      <br>
      <button @click="changeTitle('qqq')">改成【qqq】标题</button>





 ...mapMutations(['subCount', 'changeTitle']),
    handleSub (tt) {
      this.subCount(tt)
    },


action (异步

在这里插入图片描述


辅助函数mapActions

把actions中的方法提取出来,映射到组件methods


( …mapMutations([‘subCount’, ‘changeTitle’]),和 …mapActions([‘changeCountAction’]) 都在methods中
在这里插入图片描述index.js

//  action 处理异步
  // 不能直接操作state,操作state还是需要commit mutation
  actions: {
    // 此处未分模块,可当成store仓库
    // context.commit('mutation名字',额外参数)
    changeCountAction (context, num) {
      // 这里是setTime模拟异步,以后大部分场景是发请求
      setTimeout(() => {
        context.commit('changeCount', num)
      }, 2000)
    }
  }

Son2.vue

<button @click="changeCountAction(0)">2秒后改成count=0</button>


  methods: {
    changeTitle () {
      this.$store.commit('changeTitle', 'sssss')
    },
    ...mapActions(['changeCountAction']) // !!!!
  }

getters (类似于计算属性

在这里插入图片描述

通过store访问getters

store/index.js

 state: {
    title: 'hhhhh',
    count: 100,
    list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  },


//   类似于计算属性
  getters: {
    // 注意点:
    // 1. 形参第一个参数,就是state
    // 2. 必须有返回值,返回值就是getters的值
    filterList (state) {
      return state.list.filter(item => item > 5)
    }
  }


Son1.vue
<hr>
<div>{{$store.state.list}}</div>
<div>{{ $store.getters.filterList }}</div>


通过辅助函数mapGetters映射

Son2.vue

<hr>
<div>{{ filterList }}</div>

import {  mapGetters } from 'vuex'

 
 computed: {
    ...mapGetters(['filterList'])
  },


模块module

在这里插入图片描述




在这里插入图片描述store/modules/user.js

const state = {
  userInfo: {
    name: 'slx',
    age: 18
  },
  score: 80
}
const mutations = {}
const actions = {}
const getters = {}

export default {
  state,
  mutations,
  actions,
  getters
}



store/modules/setting.js
const state = {
  theme: 'light'
}
const mutations = {}
const actions = {}
const getters = {}

export default {
  state,
  mutations,
  actions,
  getters
}



store/index.js
import setting from './modules/setting'

 modules: {
    user, setting
  }


使用模块中的数据 / 模块中state的访问语法

在这里插入图片描述



子模块的状态,还是会挂到根级别的state中属性名就是模块名
在这里插入图片描述

直接通过模块名访问

Son1.js

    <div>{{ $store.state.user.userInfo.name }}</div>

通过mapState映射

默认根级别的映射 …mapState([‘user’, ‘setting’])

Son2.js

<div>{{ user.userInfo.name }}</div>
<div>{{ setting.theme }}</div>
import { mapState } from 'vuex'
  computed: {
    ...mapState(['user', 'setting']),

  },

子模块映射 mapState(‘模块名’,['xxx]) +开启命名空间

user.js

export default {
  namespaced: true,//开启命名空间
  state,
  mutations,
  actions,
  getters
}


Son2.vue

<div>{{ userInfo.name }}</div>
<div>{{ score }}</div>



 ...mapState('user', ['userInfo', 'score']), //! !!!



使用模块中getters中的数据 / 模块中getters的访问语法

直接通过模块名访问 $store.getters[‘模块名/xxx’]

user.js

const getters = {
  // 分模块后,state就是子模块的state
  UpperName (state) {
    return state.userInfo.name.toUpperCase()
  }
}



Son1.vue

<div>{{ $store.getters['user/UpperName'] }}</div>


通过mapGetters映射

在这里插入图片描述

默认根级别映射mapGetters([‘xxx’])

Son2.vue

<div>{{ filterList }}</div>



   ...mapGetters(['filterList'])


store/index.js
  getters: {
    // 注意点:
    // 1. 形参第一个参数,就是state
    // 2. 必须有返回值,返回值就是getters的值
    filterList (state) {
      return state.list.filter(item => item > 5)
    }
  },

子模块映射mapGetters(‘模块名’,[‘xxx’])+开启命名空间Son2.vue

<div>{{ UpperName }}</div>


  ...mapGetters('user', ['UpperName']), //! !!!


掌握模块中的mutation调用语法

在这里插入图片描述

直接通过store调用 $store.commit(‘模块名/xxx’,额外参数)

setting.js

const mutations = {
  setTheme (state, newtheme) {
    state.theme = newtheme
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}


Son1.vue

        <div>{{ $store.state.setting.theme }}</div>
        <button @click="changeTheme">改主题色</button>
changeTheme () {
      this.$store.commit('setting/setTheme', 'dark')
    },

通过mapMutations映射

默认根级别映射mapMutations([‘xxx’])

子模块映射mapMutations(‘模块名’,[‘xxx’])+开启命名空间

setting.js

const state = {
  theme: 'light',
  size: 16
}
const mutations = {
  setTheme (state, newtheme) {
    state.theme = newtheme
  },
  setSize (state, newSize) {
    state.size = newSize
  }
}


Son2.vue

<div>{{$store.state.setting.size}}px</div>
<button @click="setSize(90)">改px</button>





//真的注意,放在methods里,不是computed
 methods: {
    ...mapMutations('setting', ['setSize']),
    ...mapMutations('setting', ['setTheme'])
    
  }


## 模块中action的访问语法 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ae6beb82840640eab8df3c6d8d540061.png)

直接通过模块名访问 $store.dispatch(‘模块名/xxx’,额外参数)

Son1.vue

 <button @click="updateTheme2">一秒后更新</button>
methods: {
    updateTheme2 () {
      this.$store.dispatch('setting/setThemeSecond', 'orange')
    },


setting.js
const actions = {
  setThemeSecond (context, newTheme) {
    setTimeout(() => {
      // 调用mutation  context上下文,默认提交的就是自己模块action和mutation
      context.commit('setTheme', newTheme)
    }, 1000)
  }
}

在这里插入图片描述

通过mapActions映射

默认根级别映射mapActions([‘xxx’])

子模块映射mapActions(‘模块名’,[‘xxx’])+开启命名空间

Son2.vue

 <button @click="setThemeSecond('black')">一秒后更新主题</button>
   
  methods: {
 ...mapActions('setting', ['setThemeSecond'])
 }

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

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

相关文章

【Java学习】System.Console使用

背景 在自学《Java核心技术卷1》的过程中看到了对System.Console的介绍&#xff0c;编写下列测试代码&#xff0c; public class ConsoleTest {public static void main(String[] args) {Console cs System.console();String name cs.readLine("AccountInfo: ");…

谷粒商城第十一天-完善商品分组(主要添上关联属性)

目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 一、总述 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口&#xff0c;还有就是加上关联的那一套逻辑&#xff0c;…

C语言每日一题:16:数对。

思路一&#xff1a;基本思路 1.x,y均不大于n&#xff0c;就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现&#xff1a; #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…

VUE+ElementUI的表单验证二选一必填项,并且满足条件后清除表单验证提示

上代码 <el-form-item label"出库单号" prop"ecode" ref"ecode" :rules"rules.ecode"><el-input v-model"queryParams.ecode" placeholder"出库单号和出库箱号至少填写一项" clearable style"width…

Labview控制APx(Audio Precision)进行测试测量(六)

用 LabVIEW 驱动 VIs生成任意波形 在 APx500 应用程序中&#xff0c;默认波形类型为正弦。这是指 APx 内置的正弦发生器&#xff0c;根据信号路径设置&#xff0c;许多测量还允许其他内置波形&#xff0c;如方波&#xff0c;分裂正弦波或分裂相位&#xff0c;以及使用导入的。w…

27.Netty源码之FastThreadLocal

highlight: arduino-light FastThreadLocal FastThreadLocal 的实现与 ThreadLocal 非常类似&#xff0c;Netty 为 FastThreadLocal 量身打造了 FastThreadLocalThread 和 InternalThreadLocalMap 两个重要的类。下面我们看下这两个类是如何实现的。 FastThreadLocalThread 是对…

Java-低代码平台使用H2内存数据库

一、引言 作者目前在做的平台使用到了H2&#xff0c;这里介绍下使用场景、使用方式&#xff0c;出于以下两个原因会使用H2: 1、平台化的项目一般是用户使用脚本或者sql进行通用的执行&#xff0c;这样可以实现低代码平台&#xff0c;不需要管理类之间的引入、依赖、编译&#x…

4个简化IT服务台任务的ChatGPT功能

最近几个月&#xff0c;ChatGPT 风靡全球&#xff0c;这是一个 AI 聊天机器人&#xff0c;使用户能够生成脚本、文章、锻炼图表等。这项技术在各行各业都有无穷无尽的应用&#xff0c;在本文中&#xff0c;我们将研究这种现代技术如何帮助服务台团队增强服务交付和客户体验。 什…

AD7151

AD7151采用ADI公司的电容-数字转换器&#xff08;CDC&#xff09;技术,这种技术汇集了与实际传感器接口过程中起着重要作用的众多特性于一身,如高输入灵敏度,较高的输入寄生接地电容和泄漏电流容限。 集成自适应式阈值算法可对因环境因素&#xff08;如湿度和温度&#xff09;…

AI:02-基于深度学习的动物图像检索算法的研究

文章目录 一、算法原理二、代码实现三、实验结果四、总结深度学习在计算机视觉领域中的应用越来越广泛,其中动物图像检索算法是一个重要的应用场景。本文将介绍一种基于深度学习的动物图像检索算法,并提供相应的代码实现。 一、算法原理 本算法采用卷积神经网络(Convolutio…

Attention is all you need ---Transformer

大语言模型已经在很多领域大显身手&#xff0c;其应用包括只能写作、音乐创作、知识问答、聊天、客服、广告文案、论文、新闻、小说创作、润色、会议/文章摘要等等领域。在商业上模型即产品、服务即产品、插件即产品&#xff0c;任何形态的用户可触及的都可以是产品&#xff0c…

docker实现Nginx

文章目录 1.docker 安装2.docker环境实现Nginx 1.docker 安装 1.使用环境为红帽8.1,添加源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.安装 yum install docker-ce docker-ce-cli containerd.io显示出错 Docker C…

强化学习-信任区域策略优化和近端策略优化(第7章)

来源书籍&#xff1a; TENSORFLOW REINFORCEMENT LEARNING QUICK START GUIDE 《TensorFlow强化学习快速入门指南-使用Python动手搭建自学习的智能体》 著者&#xff1a;[美]考希克巴拉克里希南&#xff08;Kaushik Balakrishnan&#xff09; 译者&#xff1a;赵卫东 出版…

JSP的文件扩展名必须是.jsp吗

并不是 打开Tomcat目录下conf目录下的web.xml 也就是说,映射路径为xxx.jsp或者xxx.jspx就会访问jsp 可以修改

前后端分离------后端创建笔记(上)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

Mysql:Access denied for user ‘root‘@‘localhost‘ (using password:YES)解决方案

最近在配置Maven以及Mybatis时&#xff0c;连接localhost数据库时出现无法连接&#xff0c;用cmd测试时报错&#xff1a;Access denied for user ‘ODBC’‘localhost’ (using password: NO)&#xff0c;这个意思就是不允许远程访问&#xff0c;一开始笔者进入mysql试了一下是…

计算机网络:网络字节序

目录 一、字节序1.字节序概念2.字节序的理解&#xff08;1&#xff09;大端模式存储数据&#xff08;2&#xff09;小端模式存储数据 二、网络字节序 一、字节序 1.字节序概念 字节序&#xff1a;内存中存储多字节数据的顺序。 难道存储数据还要看顺序吗&#xff1f; yes。内…

maven是什么?安装+配置

目录 1.什么是maven&#xff1f; 1.2.maven的核心功能是什么&#xff1f; 2.Maven安装配置 2.1Maven的安装 2.2Maven环境配置 1.配置 MAVEN_HOME &#xff0c;变量值就是你的 maven 安装的路径&#xff08;bin 目录之前一级目录&#xff09; 2.将MAVEN_HOME 添加到Path系…

路由导航守卫中document.title = to.meta.title的作用以及路由跳转修改页面title

目录 &#x1f53d; document.title to.meta.title的作用 &#x1f53d; Vue路由跳转时如何更改页面title &#x1f53d; document.title to.meta.title的作用 路由导航守卫如下&#xff1a; router.beforeEach(async (to, from, next) > {document.title to.meta.ti…

“一日之际在于晨”,欢迎莅临WAVE SUMMIT上午场:Arm 虚拟硬件早餐交流会

8月16日&#xff0c;盛夏的北京将迎来第九届WAVE SUMMIT深度学习开发者大会。在峰会主论坛正式开启前&#xff0c;让我们先用一份精美的元气早餐&#xff0c;和一场“Arm虚拟硬件交流会”&#xff0c;唤醒各位开发小伙伴的开发魂&#xff01; 8月16日&#xff0c;WAVE SUMMIT大…