vue简单的数据传输

news2024/11/16 13:49:49

很久没有水文了,最近又得了新冠才好,学习也没什么进度,先复习下之前的组件的数据传输吧!

props传值

这个很简单就是在组件标签上转递数据,值得注意的是如果不使用v-bind:(:),转递的数据会全部认为是字符串
父组件的template
<demo :datas="datas"/>
子组件
数组写法:
props:["datas"]
对象写法
可以传的类型
String
Number
Boolean
Function
Object
Array
Symbol

props:{
     datas:{
     type:object,
     // required:true是不是必需要传值
     //defualt:function(){
     return {
     msg:"你好啊!"
     }
     }

比较特别的:validator

 "datas": {
    validator: function (value) {//传过来的value,其实也可以用computed实现一样的效果
        return value >= 0 && value <= 100;
    }
}

转递函数法(子传父)

普通的props只能用于父传子,借助函数的转递是引用转递不是值传递这一特性,我们可以让父组件用props传递一个函数给子组件去使用。
父组件

<demo :getdata="getdata"/>


methods: {
     getdata(name) {
      console.log("这是父组件的方法",name);
    },
  }

子组件

props: ["getdata"]

 methods: {
    handler() {
      this.getdata(this.name);
    },
  }

<button @click="handler">这是子组件的按钮</button>//通过按钮事件来触发

自定义事件

直接在标签里绑

适用于子传父,是事件总线的基础
自定义组件中
接收数据的一方给转递数据的组件绑定自定义事件;
<student v-on:hwk="demo" @t2="test"/>
传递数据的一方设置触发和解绑自定义事件

template:
`<button @click="sendStuentName">把学生名给app</button>`
js:
 sendStuentName(){
    this.$emit("hwk",this.name);
    this.$emit("t2");
  }
  解绑
   unbind(){
    //this.$off("hwk")单个解绑
    this.$off(["hwk","t2"]);//多个解绑用数组
    //this.$off()全部解绑
  }

用ref 来实现绑定

父组件:
<testref ref="testRef"/>

 mounted(){
   setTimeout(()=>{  this.$refs.testRef.$on("reftest",this.testRef)},3000)//.once只会触发一次
   //这里不能使用普通函数,因为普通函数this会指向调用者,setTimeout是window对象上的方法,故this指向window而不是vm,使用箭头函数this将一直指向缔造者vm
  }

子组件

 this.$emit("reftest",this.msg,300,100,200);

全局总线(对于任意组件)

适用于任一组件之间的通信,可以说是结合了自定义事件和原型链的优点,
借助vue的原型是vm和vc都可以访问的,把一个组件专门用来传递数据,一般我们直接把vm作为这个中转站,我们这个类似于全局变量的就叫全局总线。
1安装全局事件总线
mian.js

new Vue({
  render: h => h(App),
 beforeCreate(){
   Vue.prototype.$bus=this;//安装全局事件总线
 },

}).$mount('#app')

转递数据的组件还是借助总线设置触发事件

<template>
  <div class="brother1">
    <h2>{{ name }}</h2>
    <button  @click="brothersendmsg">brother传参</button>
  </div>
</template>

<script>


export default {
data(){
    return {
        name:"brother1",
        datas:"brother1传参成功!"
    }
},
methods:{
    brothersendmsg(){
        this.$bus.$emit("brother",this.datas)
    }
}
}   
</script>

接收数据的组件还是借助¥bus来绑定自定义事件,记得销毁组件的时候解绑事件

<template>
  <div class="broth2">
    <h2>{{ name }}</h2>
  </div>
</template>

<script>
export default {
   data(){
    return{     
        name:"brother2"
    }
   },
   mounted(){
    this.$bus.$on("brother",this.showdatas);
   },
   methods:{
    showdatas(msg){
      console.log(msg);
    }
   },
   beforeDestroy(){
    this.$bus.$off("brother");//因为vm一直在,¥bus不会销毁,组件销毁后这个事件并不会自动销毁
   }
}
</script>

组件里的事件都会认为是自定义事件,若是想用vue自带的,要在事件后面加.native。
前面几个的运行截图:
在这里插入图片描述

消息订阅与发布

安装
·npm i pubsub-js@1.6.0
模型与事件总线差不多,但是用的第三方库,可支持跨框架使用
school.vue

  <template>
    <div class="school">
      {{ schollname}}
     
    </div>
  </template>
  <script>
    import pubsub from "pubsub-js"

  export default {
    // 通过父组件给子组件转递函数来实现子转递父(不支持驼峰命名法!)
    props: ["getdata"],
    mounted(){
      this.pubId= pubsub.subscribe('hello',(msgName,data)=>{//订阅hello消息,存储消息的id
        console.log("hello定义成功了",msgName,data)
      })
    },
    data(){
      return{
        name:"测试成功了",
        schollname:"湖应"
      }
    },
    beforeDestroy(){
      pubsub.unsubscribe(this.pubId)//vc销毁后,订阅被取消
    }
  };
  </script>
  <style>
  .school{
    background-color: #234;
    width:300px;
    color: yellow;
  }
  </style>

student.vue

<template>
    <div class="student">
    <h2>{{ name }}</h2>
    <h2>{{ sex }} </h2>
    <button @click="sendStuentName">开始发布消息</button>
    </div>
  </template>
  
  <script>
    import pubsub from 'pubsub-js';
  export default {
    props:[],
    data(){
      return{
          name:"张三丰",
          sex:"男"
      }
    },
   methods:{
    //自定义来传参数
    sendStuentName(){
      pubsub.publish("hello",666)//发布hello消息
    },
   
   },
 
  }
  </script>
  
  <style>
    .student {
      background-color: rgb(77, 178, 19);
      width: 300px;
      height: 100px;
    }
  </style>

运行截图:
在这里插入图片描述

Vuex

vuex更适合于组件共享,相比于事件总线,更加适用于大型项目,并且vuex支持内部模块化。

流程:
在这里插入图片描述

准备:
在不考虑内部模块化的情况下,我们一般在src文件夹下面创建store文件夹,并在这文件夹创建,index.js来存放vuex相关js代码。

提醒:
由于js执行是先预处理,所以import的语句会先执行,而我们创建store需要用到vuex的api,故vuex要先使用
Vue.use(Vuex),所以我们在index.js中引入Vuex和使用它。

state(状态)vuex用来存放普通数据的地方,类似于vm的data
getters 是用来将state的数据进行业务需求变化的地方,类似于vm的computed,在store里面代码比在vm里写computed更简洁

流程说明:
通过在实例化vm的时候将store加载上去,
vc通过this.$store.dispatch(context,value)来与Action交互,Action本质就是一个普通的object,用来处理数据的业务逻辑变化和后端的交互;
dipatch()这个api有两个形参,一个是context,这是裁剪版的store,用来调用commit这个api,将数据交给mutations去处理,也可以继续dispatch(将数据交给Actions的另一个函数去处理,提高复用性),第二个value就是传用来的数据
通过Actions的处理后,通过context.commit(state,value)数据到达了mutations这里,这里是真正修改数据的地方,通过state直接去修改数据,如果逻辑很简单,可以直接跳过,dispatch,直接commit。
这个需要用到一个插件nanoid和axios
在终端输入npm i nanoid安装
npm install axios --save

demo源码
main.js

import Vue from 'vue'
import App from './App.vue'
import store from "./store/index.js"
Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  store,
}).$mount('#app')

index.js

//用于创建Vuex的store
//相应组件的动作
import Vue from "vue"
import Vuex from "vuex"
import axios from "axios"
import { nanoid } from "nanoid";


const countoption={
  namespaced:true,//命名空间开启
  actions:{
    jiaodd(context,value){
      if(context.state.sum%2){
        context.commit("JIA",value)
      }
    },
    jiawait(context,value){
      setTimeout(() => {
        context.commit("JIA",value)
      }, 500);
    }
  },
  mutations:{
    JIA(state,value){
      state.sum+=value
     },
     JIAN(state,value){
      state.sum-=value
     }
  },
  state:{
    sum:0,
    name:"hwk",
    subject:"前端",
  },
  getters:{
    bigSum(state){
      return state.sum*10
    }
  }
}

const personsoption={
  namespaced:true,
  actions:{
    addpeesonWang(context,value){
      if(value.name.indexOf("王")==0){
        context.commit("ADD_PERSON", value)
      }
      else{
        alert("添加的人必须姓王")
      }
    },
    addPersonServer(context){//与后端交互
      axios.get("https://api.uixsj.cn/hitokoto/get?type=social").then(
        Response=>{
          context.commit("ADD_PERSON",{id:nanoid(),name:Response.data})
        },
        error=>{
          alert(error.message)
        }
      )
    }
  },
  mutations:{
    ADD_PERSON(state,value){
      state.persons.unshift(value)
     }
  },
  state:{
    persons:[{id:"001",name:"张三"}]
  },
  getters:{
    firstPeronsName(state){
      return state.persons[0].name
    }
  }
}
//操作数据

//存储数据的

Vue.use(Vuex)
const store =new Vuex.Store(
    {
       modules:{
        countAbout:countoption,
        personsAbout:personsoption
       }
    }
)
export default store

count.vue

<template>
<div class="demo">
    <h1>当前求和{{ sum }}</h1>
    <h2>求和乘以10:{{ bigSum }}</h2>
    <h3>{{ name }}在学{{ subject }}</h3>
    <h2>下方组件的人数;{{ persons.length }}</h2>
<select v-model.number="n">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<button @click="add(n)">+</button>
<button @click="decrement(n)">-</button>
<button @click="odd(n)">当前为奇数再加</button>
<button @click="awaita(n)">等一等在加</button>
<hr>
</div>
</template>

<script>
import { mapState,mapGetters,mapMutations,mapActions } from 'vuex'
export default {
   name:"count",
   data(){
    return{
        n:1
    }
   },
   computed:{
    // sum(){
    //     return this.$store.state.sum
    // },
    // bigSum(){
    //     return this.$store.getters.bigSum
    // },
    ...mapState({sum:"sum",name:"name",subject:"subject",persons:"persons"}),  //借助vuex的mapState去生成computed代码,键值对都是字符串
    //...mapState(["sum","name","subject"])数组形式简写,键值是一样的
    ...mapGetters(["bigSum"])//借组vuex的mapgetters去生成computed
    // name(){
    //     return this.$store.state.name
    // },
    // subject(){
    //     return this.$store.state.subject
    // }
   },
   methods:{
    // add(){
    //  this.$store.commit("JIA",this.n)
    // },
    // decrement(){
    //  this.$store.commit("JIAN",this.n)
    // },
    ...mapMutations({add:"JIA",decrement:"JIAN"}),//用mapMutations去生成包含commit的函数,键值对都是字符串,键是VC的函数名,值是Mutations的属性名。
    ...mapActions({odd:"jiaodd",awaita:"jiawait"})//用mapMutations去生成包含dispatch的函数,键值对都是字符串。
    // odd(){
    //  if(this.$store.state.sum%2){
    //     this.$store.dispatch("jiaodd",this.n)
    //  }
    // },
    // awaita(){
    //     setTimeout(() => {
    //        this.$store.dispatch("jiawait",this.n)
    //     }, 500);
    // }
},
mounted(){

}
}
</script>

<style scoped>
   .demo button{
     margin: 10px;
   }
</style>

persons.vue

<template>
  <div>
    <h2>人员列表</h2>
    <h3>count组件的求和为{{ sum }}</h3>
    <h3>列表中第一个人的名字:{{firstPersonName}}</h3>
    <input type="text" placeholder="请输入名字。" v-model="name">
    <button @click="add">添加</button>
    <button @click="addwang">特殊的添加</button>
    <button @click="addPersonServer">向服务器请求数据</button>
    <ul>
        <li v-for="p in persons" :key="p.id">{{ p.name }}</li>
    </ul>
  </div>
</template>

<script>

import { nanoid } from 'nanoid';

export default {
name:"persons",
computed:{
  persons(){
    return this.$store.state.personsAbout.persons
  },
  sum(){
    return this.$store.state.countAbout.sum
  },
  firstPersonName(){
    return this.$store.getters["personsAbout/firstPeronsName"]
  }

},
data(){
  return{
    name:""
  }
},
methods:{
  add(){
    const person ={id:nanoid(),name:this.name}
    this.$store.commit("personsAbout/ADD_PERSON",person)
    this.name=""
  },
  addwang(){
    const person={id:nanoid(),name:this.name}
    this.$store.dispatch("personsAbout/addpeesonWang",person)
    this.name=""
  },
  addPersonServer(){
    this.$store.dispatch("personsAbout/addPersonServer")
  }
}
}
</script>

<style>
</style>

运行截图:
在这里插入图片描述

开发者工具:
在这里插入图片描述

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

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

相关文章

任务二:Web隐藏信息获取

任务二:Web隐藏信息获取 任务环境说明: 服务器场景名:web20200604服务器场景用户名:未知通过本地PC中渗透测试平台Kali使用Nmap扫描目标靶机HTTP服务子目录,将扫描子目录命令所需参数及第四条扫描结果关键目录以&符号拼接,作为Flag提交(例:-p 22&/root/); …

【信息学CSP-J近16年历年真题64题】真题练习与解析 第11题之纪念品

纪念品 描述 小伟突然获得一种超能力,他知道未来 T 天 N 种纪念品每天的价格。某个纪念品 的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。 每天,小伟可以进行以下两种交易无限次: 任选一个纪念品,若手上有足够金币,以当日价格购买该…

Android---DrawerLayout + NavigationView

现在 Android Studio 已经直接提供左滑菜单功能&#xff0c;只需要在创建新项目时选择 Navigation Drawer Activity 就可以直接创建一个有左滑菜单功能的 APP。 目录 DrawerLayout NavigationView android:src 与 app:srcCompat fitsSystemWindows DrawerLayout …

数据报告重要的是业务看得懂

一、前言上篇文章我们从指标库的角度梳理了指标是如何计算出来的&#xff0c;确保业务人员有数可寻&#xff0c;但对于业务人员而言&#xff0c;并不是所有的指标都看得懂&#xff0c;也不是所有的指标都需要理解&#xff0c;笔者见过太多不知所云的数据报告&#xff0c;各种模…

Maven高级-分模块拆分

Maven高级 分模块开发与设计 聚合 继承 属性 版本管理 资源配置 多环境开发配置 跳过测试 私服 分模块开发与设计 拷贝原始项目中对应的相关内容到ssm_pojo模块中 ​ 实体类&#xff08;User&#xff09; ​ 配置文件&#xff08;无&#xff09; User.java package com.i…

S32K144-S32DS 导入/编译/烧录 遇到的问题

找到你开发套件软件安装包的路径&#xff0c;里面有四个例子&#xff0c;任选一个&#xff1b;不要忘记复制到工作区 问题一&#xff1a;修改电机库的路径 问题二&#xff1a;freemaster路径问题 编译还是报错&#xff0c;好像还必须安装FreeMaster 安装之后&#xff0c;还是这…

电子招标采购系统源码:构建高效智能数字化采购

过去几十年&#xff0c;公用事业行业发生了重大变化。能源需求的转变导致企业利润率的波动&#xff0c;但不是运营成本的波动。 许多公用事业公司通过后勤部门流程自动化来削减成本&#xff0c;比如招采流程自动化。 在招采活动中&#xff0c;人工招采会产生盲点。由于公共事业…

【MySQL】MySQL视图原理与实战(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/Liunx内核/C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1f4…

ArcGIS基础实验操作100例--实验51CAD转要素类

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验51 CAD转要素类 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&#…

多线程之线程安全问题

1.线程安全示例 class Count{int a 0;public void add(){a;} } public class ThreadDemo8 {public static void main(String[] args) {Count count new Count();Thread t1 new Thread(()->{for (int i 0; i < 5_0000; i) {count.add();}});Thread t2 new Thread(()…

这款企业报表工具给你灵活的数据查询体验

随着对BI应用程度的加深&#xff0c;用户需要连接和管理的数据越来越多&#xff0c;也越来越复杂。电子表格软件支持丰富的数据源接入&#xff0c;但一般并不能直接使用接入的业务库直接进行数据分析。所以在报表开发前的取数过程&#xff0c;把需要的数据整合成一个数据集合&a…

Ajax技术

全局刷新和局部刷新 在B/S 结构的项目中&#xff0c; 浏览器端负责把用户的请求和参数通过网络发送给服务器,服务端负责接收请求&#xff0c;并将处理的结果返回给浏览器。浏览器端负责展示响应结果给用户。 全局刷新 整个浏览器被新的数据覆盖。在网络中传输大量的数据。浏…

经历了资本的狂热追捧之后,元宇宙开始进入到相对冷静的发展阶段里

经历了资本的狂热追捧之后&#xff0c;元宇宙开始进入到相对冷静的发展阶段里。在这样一个阶段&#xff0c;元宇宙不再被看成是一个万能的存在&#xff0c;不再被看成是一个无所不包的存在&#xff0c;而是变成了一个相对较为客观和理性的存在。看看Meta的表现&#xff0c;看看…

C#语言实例源码系列-游戏-实现俄罗斯方块

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

css新特性:线性渐变详解(重复性线性渐变、径向渐变、重复性径向渐变的使用)

线性渐变线性渐变重复性线性渐变径向渐变重复性径向渐变的使用线性渐变 线性渐变是向下、向上、向左、向右、对角方向的颜色渐变。 其语法格式为&#xff1a; background-image: linear-gradient(side-or-corner|angle, linear-color-stop);参数说明如下&#xff1a; side-o…

C++——二叉树OJ

目录 1.根据二叉树创建字符串 2.二叉树的层序遍历 3.二叉树的层序遍历2 4.二叉树的最近公共祖先 5. 搜索二叉树与双向链表 6.从前序与中序遍历构建二叉树 1.根据二叉树创建字符串 按照前序遍历&#xff1a;根左右。 1(2(4()())())(3()()) 1.左右都为空&#xff0c;则可…

通过PWM控制串行LED灯

资料下载 RGB_LED灯带_5050慢闪_datasheet STM32控制LED灯带 根据上面的说明书可知&#xff0c;通过修改800KHz的PWM波形的占空比可以控制LED的颜色。 假设现在有3颗串联起来的灯珠&#xff0c;如下图&#xff1a; 如果U1/U2/U3需要显示红/绿/蓝色&#xff0c;根据说明书&…

Vue3 的项目搭建

使用工具&#xff1a; VSCode Volar &#xff1a;编辑器和插件Vite&#xff1a;打包工具Vue3&#xff1a;VueX&#xff1a;存储NodeJs&#xff1a;环境 操作步骤&#xff1a; 安装Node.js安装VsCode安装 Volar创建一个Vite的初始化项目 npm init viteProject name 这一行 我…

Linux系统下刨析hello world背后的秘密

Hi&#xff0c;小伙伴们&#xff0c;大家好&#xff01;今天给大家讲解Linux系统编程中几个重要的概念。必须理解了这几个重要概念&#xff0c;才能更快的入门Linux系统编程&#xff0c;这是不可或缺的基础知识。看似简单&#xff0c;如果不花一番功夫很难真正的理解它们。需要…

113.(leaflet之家)leaflet根据距离截取线段

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>