24. 前端-js框架-Vue

文章目录

  • 前言
  • 一、Vue介绍
    • 1. 学习导图
    • 2. 特点
    • 3. 安装
      • 1. 方式一:独立版本
      • 2. 方式二:CDN方法
      • 3. 方式三:NPM方法(推荐使用)
    • 4. 搭建Vue的开发环境(大纲)
    • 5. 工程结构
    • 6. 安装依赖资源
    • 7. 运行项目
    • 8. Vue导入示例
  • 二、语法
    • 1. 钩子函数
    • 2. 插值表达式
    • 3. 显示数据(v-text和v-html)
    • 4. 数据双向绑定数据(v-model)
    • 5. 事件处理(v-on)
      • 1. 事件绑定(v-on)
      • 2. 事件修饰符
    • 6. 循环遍历(v-for)
      • 1. 遍历数组
      • 2. 遍历对象
      • 3. key
    • 7. 判断语法(v-if和v-show)
    • 8. 显示数据(v-bind)
    • 9. Vue页面跳转
      • 1. 方法一(标签实现)
      • 2. 方法二(this.$router.push()实现)
    • 10. 计算属性
    • 11. watch监控
  • 三、Vue组件
    • 1. 简介
    • 2. 父组件向子组件通信
    • 3. 子组件向父组件通信
  • 四、axios异步请求
    • 1. axios概述
    • 2. Get请求
    • 3. Post请求
    • 4. 跨域请求
    • 5. vue-resource
  • 五、综合案例


前言

微前端

  Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,帮助提高前端开发效率。它不仅易于上手,还便于与第三方库或既有项目整合。
  本文介绍Vue.js的基础知识,包括安装、基本语法、数据绑定、事件处理、组件、异步请求等内容。


一、Vue介绍

1. 学习导图

VUE学习导图

2. 特点

​Vue通过MVVM模式,能够实现视图与模型的双向绑定。简单来说,就是数据变化的时候, 页面会自动刷新, 页面变化的时候,数据也会自动变化。

  1. 解耦视图和数据
  2. 可复用的组件
  3. 前端路由技术
  4. 状态管理
  5. 虚拟DOM

3. 安装

1. 方式一:独立版本

我们可以在Vue.js的官网上直接下载vue.js。
并在 .html 中通过 script 标签中引用。

<script src = ../vue.js> </script> 

开发环境不要使用最小压缩版,不然会没有错误提示和警告!(页面中直接使用)

使用vue多页面开发:

  • 引入vue.js
  • 创建一个vue根实例 new Vue({选项})

2. 方式二:CDN方法

可以选择引入开发环境版本还是生产环境版本。

<!-- 开发环境版本,包含了有帮助的命令行警告 --> 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
  • BootCDN(国内) : https://cdn.bootcss.com/vue/2.2.2/vue.min.js (国内不稳定)
  • unpkg:https://unpkg.com/vue/dist/vue.js, 会保持和 npm 发布的最新的版本一致。(推荐使用)
  • cdnjs : https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js,如
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js">
</script>

3. 方式三:NPM方法(推荐使用)

通过webpack和CLI的使用。

  在用Vue.js构建大型应用的时候推荐使用NPM安装方法,NPM能很好的和诸如 Webpack 或者Browserify 模块打包器配合使用。Vue.js 也提供配套工具来开发单文件组件。

  1. 首先,先罗列接下来需要的东西:
  • node.js环境(npm包管理器)
  • vue-cli 脚手架构建工具
  • cnpm npm的淘宝镜像

4. 搭建Vue的开发环境(大纲)

  1. 必须安装node.js node安装步骤

  2. 搭建vue的开发环境,安装vue的脚手架工具,官方命令行工具

npm install --global vue-cli
  1. 创建项目 需要cd到对应的一个项目里面
vue init webpack vuedome03
cd  vuedome03

如果创建报错,需要执行

cnpm install   /  npm install   /  npm install --force
  1. 运行项目
npm run dev/npm run start
  1. 另一种创建项目的方式中小型项目 (推荐)
vue init webpack-simple vuedemo04
cd  vuedemo04
cnpm install   /  npm install
npm run dev

拿到既存项目不能正常运行后看有没有 node_modules 这个文件(项目所有的依赖),若没有,cd到项目中安装项目的依赖:cnpm install / npm install / npm install --force

5. 工程结构

介绍一下目录及其作用:

  • build:最终发布的代码的存放位置。

  • config:配置路径、端口号等一些信息,我们刚开始学习的时候选择默认配置。

  • node_modules:npm 加载的项目所需要的各种依赖模块。

  • src:这里是我们开发的主要目录(源码),基本上要做的事情都在这个目录里面,里面包含了几个目录及文件**:

  • assets:放置一些静态资源文件、css、js、图片(会根据图片大小分类进行base64命名还是其他方式命名)等;如果静态资源是放在src/assets目录那么会经过webpack/vite打包处理,包括压缩、重命名等,其他所有的构建后的JS、CSS都会放在dist/assets文件下。

  • components:目录里放的是一个个的组件文件(一般公共组件)

  • router/index.js:配置路由的地方

  • App.vue:项目入口组件(根组件),我们也可以将组件写这里,而不使用components目录。主要作用就是将我们自己定义的组件通过它与页面建立联系进行渲染,这里面的必不可少。

  • **main.js **:项目的核心文件(整个项目的入口js)引入依赖包、默认页面样式等(项目运行后会在index.html中形成一个app.js文件)。

  • api:接口

  • store:状态管理vuex

  • styles:样式

  • utils:工具函数

  • views/pages:页面

  • test:初始测试目录,可删除

  • .XXXX文件:配置文件。

  • static:静态资源目录(会原分不动的对文件进行处理),如图片、字体等。

  • public:该目录为纯静态文件,图片等放该目录后,打包构建时不会做任何处理。

  • public/index.html:html单页面的入口页面(生产访问的页面),可以添加一些meta信息或者同统计代码啥的或页面的重置样式等。

  • package.json:项目配置信息文件/所依赖的开发包的版本信息及所依赖的插件信息。(大概版本)

  • package-lock.json:项目配置信息文件/所依赖的开发包的版本信息及所依赖的插件信息。(具体版本)

  • README.md:项目的说明文件。

  • webpack.config.js:webpack的配置文件,例:把.vue的文件打包成浏览器能读懂的文件。

  • .babelrc:是检测es6语法的配置文件,例:适配哪些浏览器的限制

  • .gitignore:上传到服务器忽略哪些文件的配置(比如模拟本地数据mock不让他在get提交/打包上线的时候忽略不使用可在这里配置)

  • .postcssrc.js:前缀的配置 (css转化的配置)

  • .editorconfig:对代码进行规范,例:root是否进行检测,代码尾部是否换行,缩行前面几个空格…(建议定义这个规范)

  • .eslintrc.js:配置eslint语法规则(在这里面的rules属性中配置让哪个语法规则失效)

  • .eslintignore:忽略eslint对项目某些文件的语法规则的检查

这就是整个项目的目录结构,其中,我们主要在src目录中做修改(模块化开发)。

6. 安装依赖资源

cd 项目名;进入项目中

安装项目所需要的依赖包/插件(在package.json可查看):执行 npm install (npm可能会有警告,这里可以用cnpm代替npm了,运行别人的代码需要先安装依赖)如果创建项目的时候没有报错,这一步可以省略。如果报错了 cd到项目里面运行 cnpm install / npm install

若拉取既有项目或从github下载的项目,第一步就是要在项目中 npm install ;下载项目所依赖的插件,然后 npm run dev 运行项目

npm install 命令用来安装模块到node_modules目录
npm install 安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。
npm install --force / npm install -f 如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f或–force参数。

安装完成之后,我们到自己的项目中去看,会多一个node_modules文件夹,这里面就是我们所需要的依赖包资源。

安装完依赖包资源后,我们就可以运行整个项目了。

7. 运行项目

在项目目录中,运行命令 npm run dev (npm run start),会用热加载的方式运行我们的应用,热加载可以让我们在修改完代码后不用手动刷新浏览器就能实时看到修改后的效果。

运行项目npm run

项目启动后,在浏览器中输入项目启动后的地址:

运行项目启动

在浏览器中会出现vue的logo:

Vue启动画面

项目完成后输入打包命令: npm run build ,会生成一个dist文件,就是我们的打包文件,点击.html文件能运行则成功。

8. Vue导入示例

  • 概述:Vue是一个类似于Jquery的一个JS框架,所以,如果想使用Vue,则在当前页面导入Vue.js文件即可。

  • 语法

<!-- 在线导入 -->
<!-- 开发环境版本,包含了用帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script><!-- 本地导入 -->
<script src="node_modules/vue/dist/vue.js"></script>
  • 示例
<div id="app"><h1>用户名:<input type="text" v-model="name"/></h1> <br/><h1>您输入的用户名是: {{name}}</h1>
</div><script type="text/javascript">//创建一个Vue对象var app = new Vue({//指定,该对象代表<div id="app">,也就是说,这个div中的所有内容,都被当前的app对象管理el: "#app",//定义vue中的数据data: {name: ""}});
</script>

二、语法

1. 钩子函数

  • 概述:Vue伴随着生命周期,提前定义好的事件, 其作用类似于Servlet的 init 和 destroy 方法。

  • 语法

    • 什么是vue生命周期?
      Vue 实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。

    • vue生命周期的作用是什么?
      Vue生命周期中有多个事件钩子,让我们在控制整个Vue实例过程时更容易形成好的逻辑。

    • vue生命周期总共有几个阶段?
      可以总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/后。

    • 第一次页面加载会触发哪几个钩子?
      第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子

    • DOM 渲染在 哪个周期中就已经完成?
      DOM 渲染在 mounted 中就已经完成了。

    • 简单描述每个周期具体适合哪些场景?
      生命周期钩子的一些使用方法:
      beforecreate : 可以在此阶段加loading事件,在加载实例时触发;
      created : 初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用;
      mounted : 挂载元素,获取到DOM节点;
      updated : 如果对数据统一处理,在这里写上相应函数;
      beforeDestroy : 可以做一个确认停止事件的确认框;
      nextTick : 更新数据后立即操作dom;

Vue生命周期和钩子函数

  • 示例
<script type="text/javascript">var app = new Vue({el:"#app",//钩子函数created,该方法在页面显示之后,自动执行created() {console.log("created...");}});
</script>

2. 插值表达式

  • 概述:用户把vue中所定义的数据,显示在页面上。插值表达式允许用户输入"JS代码片段"。

  • 语法{{ 变量名/对象.属性名 }}

  • 示例

<html lang="en">
<head><meta charset="UTF-8"><title>vue插值表达式</title><script src="node_modules/vue/dist/vue.js"></script>
</head>
<body><div id="app"><h1>欢迎来到-->{{ name }}</h1></div><script type="text/javascript">//创建vue对象var app = new Vue({//让vue接管div标签el:"#app",//定义数据,里边包含一个属性name,值为"XXX"data:{name:"XXX"}});</script>
</body>
</html>

3. 显示数据(v-text和v-html)

  • 概述:v-text和v-html专门用来展示数据,其作用和插值表达式类似。

    • v-text和v-html可以避免插值闪烁问题。
      插值闪烁: 在数据未加载完成时,页面会显示出原始的{{}},过一会才会展示正常数据。当网速比较慢时,使用{{}}来展示数据, 有可能会产生插值闪烁问题。

    • 区别
      v-text:把数据当作纯文本显示.
      v-html:遇到html标签,会正常解析

  • 语法

<span v-text="msg"></span>	<!-- v-text:相当于<span>{{msg}}</span> -->
<span v-html="msg"></span>	<!-- v-html:相当于<span>{{msg}}</span> -->

4. 数据双向绑定数据(v-model)

  • 概述:数据变化的时候,页面会自动刷新,页面变化的时候,数据也会自动变化。

  • 注意

    • 双向绑定, 只能绑定文本框,单选按钮,复选框,文本域,下拉列表
    • 文本框/单选按钮/textarea, 绑定的数据是字符串类型
    • 单个复选框, 绑定的是boolean类型
    • 多个复选框, 绑定的是数组
    • select单选对应字符串,多选对应也是数组
  • 示例

    • 绑定文本框
<div id="app">用户名: <input type="text" v-model="username"/>
</div>
<script type="text/javascript">var app = new Vue({el:"#app",data:{//该属性值和文本框的value属性值,保持一致username:""}});
</script>

效果:

绑定文本框

  • 绑定单个复选框
<div id="app"><input type="checkbox" v-model="agree">同意<br>
</div>
<script type="text/javascript">var app = new Vue({el:"#app",data:{agree:true}});
</script>

效果:

绑定单个复选框

  • 绑定多个复选框
<div id="app"><input type="checkbox" value="Java" v-model="language">Java<br><input type="checkbox" value="Python" v-model="language">Python<br><input type="checkbox" value="Swift" v-model="language">Swift<br>
</div>
<script type="text/javascript">var app = new Vue({el:"#app",data:{//数组中的值,就是被选中的元素的value属性值language:["Java","Python"]}});
</script>

效果:

绑定多个复选框

  • form表单数据提交
<template><div class="from_box"><form action=""><input type="text"  placeholder="请输入昵称" v-model="formMess.account"><input type="password" placeholder="请输入密码" v-model="formMess.act_pwd"><input type="text" placeholder="请输入手机号" v-model="formMess.phone"></form><span class="but" @click="onSubmit()">提交</span></div>
</template><script>
import axios from 'axios';export default {name: "from",data() {return {formMess:{"account":"","act_pwd":"","phone":""}};},methods: {onSubmit() {/* json格式提交: */// let formData = JSON.stringify(this.formMess);/* formData格式提交: */let formData = new FormData();for(var key in this.formMess){formData.append(key,this.formMess[key]);}axios({method:"post",url:"xxxxxxx",headers: {"Content-Type": "multipart/form-data"},withCredentials:true,data:formData}).then((res)=>{console.log(res);});}}
};
</script>

5. 事件处理(v-on)

1. 事件绑定(v-on)

  • 概述:Vue中也可以给页面元素绑定事件。

  • 语法

<!--完整写法-->
<button v-on:事件名="函数名/vue表达式">点我</button>
<!--简化写法-->
<button @事件名="函数名/vue表达式">点我</button>
  • 注意:Vue支持html中所有已知事件,如:@click, @submit等,只不过事件的名字不带on。

  • 示例

<html lang="en">
<head><meta charset="UTF-8"><title>vue事件处理</title><script src="node_modules/vue/dist/vue.js"></script>
</head>
<body><div id="app"><button @click="show">点我</button></div><script type="text/javascript">//创建vue对象var app = new Vue({//获取id为app的元素,该元素被vue对象所管理.只有被vue对象管理的标签,其内部才允许书写vue语法el:"#app",//定义vue的方法methods:{//定义show方法,弹出提示框show() {alert("Hello Vue!!!");}}});</script>
</body>
</html>

2. 事件修饰符

  • 概述:事件修饰符主要对事件的发生范围进行限定。

  • 语法

<button @事件名.事件修饰符="函数名/vue表达式">点我</button>
  • 分类

    • .stop :阻止事件冒泡, 也就是当前元素发生事件,但当前元素的父元素不发生该事件
    • .prevent :阻止默认事件发生
    • .capture :使用事件捕获模式, 主动获取子元素发生事件, 把获取到的事件当自己的事件执行
    • .self :只有元素自身触发事件才执行。(冒泡或捕获的都不执行)
    • .once :只执行一次
  • 示例

<html lang="en">
<head><meta charset="UTF-8"><title>vue事件处理</title><script src="node_modules/vue/dist/vue.js"></script>
</head>
<body><div id="app"><button @click="show">点我</button></div><script type="text/javascript">//创建vue对象var app = new Vue({//获取id为app的元素,该元素被vue对象所管理.只有被vue对象管理的标签,其内部才允许书写vue语法el:"#app",//定义vue的方法methods:{//定义show方法,弹出提示框show() {alert("Hello Vue!!!");}}});</script>
</body>
</html>

6. 循环遍历(v-for)

1. 遍历数组

  • 语法
v-for="item in items"
v-for="(item,index) in items"

items:要迭代的数组
item:存储数组元素的变量名
index:迭代到的当前元素索引,从0开始。

  • 示例
<div id="app"><ul><li v-for="(user, index) in users">{{index}}--{{user.name}}--{{user.age}}--{{user.gender}}</li></ul>
</div>
<script>var app = new Vue({el:"#app",//el即element,要渲染的页面元素data: {users:[{"name":"XXX","age":8,"gender":"男"},{"name":"YYY","age":12,"gender":"女"},{"name":"ZZZ","age":4,"gender":"男"}]}});
</script>

2. 遍历对象

  • 语法
v-for="value in object"
v-for="(value,key) in object"
v-for="(value,key,index) in object"

value,对象的值
key, 对象的键
index, 索引,从0开始

  • 示例
<div id="app"><ul><li v-for="(value,key,index) in person">{{index}}--{{key}}--{{value}}</li></ul>
</div>
<script>var app = new Vue({el:"#app",//el即element,要渲染的页面元素data: {person:{"name":"XXX", "age":3, "address":"中国"}}});
</script>

3. key

  • 概述:一般配合v-for一起使用,用来在特定情况下,保证被遍历的数组中的元素的顺序。

  • 示例

<div id="app"><button @click="add">添加</button><ul><!-- 添加:key即可. 注意,key中的值必须是唯一且不会改变的值--><li v-for="name in list" :key="name"><input type="checkbox"> {{name}}</li></ul>
</div>
<script>var app = new Vue({el: '#app',data: {list: ["孙悟空", "猪八戒", "沙和尚"]},methods: {add() {//注意这里是unshift,向数组的头部添加一个元素this.list.unshift("唐僧");}}});
</script>

7. 判断语法(v-if和v-show)

  • 概述:v-if与v-show可以根据条件的结果,来决定是否显示指定内容。

    • v-if:条件不满足时, 元素不会存在。
    • v-show:条件不满足时, 元素不会显示(但仍然存在)。
  • 示例

<div id="app"><button @click="show = !show">点我</button><h1 v-if="show">Hello v-if.</h1><h1 v-show="show">Hello v-show.</h1>
</div>
<script>var app = new Vue({el:"#app",data: {show:true}});
</script>

8. 显示数据(v-bind)

  • 概述:v-bind的作用和插值表达式差不多,只不过,v-bind主要用于动态设置标签的属性值。

  • 语法

<!--完整写法-->
<标签名 v-bind:标签属性名="vue实例中的数据属性名"/>
<!--简化写法-->
<标签名 :标签属性名="vue实例中的数据属性名"/>
  • 示例
<div id="app"><input type="button" :value="msg"/>
</div>
<script type="text/javascript">var app = new Vue({el:"#app",data:{msg:"我是按钮"}});</script>

9. Vue页面跳转

1. 方法一(标签实现)

<router-link :to="{name: 'bookshelf', params: { entityId: this.entityId } }":class="{'flex-item-1':'flex-item-1',cur:tabs[0].isShow}" href="javascript:"><span class="tabNav-ico tabNav-book"></span><span class="tabNav-txt">书 架</span></router-link>

2. 方法二(this.$router.push()实现)

  • 概述:当this.$router.push()只有一个参数时,默认为跳转地址,最多可传两个参数,第二个参数为地址参数。

  • 示例

<a @click="toIndex" :class="{'flex-item-1':'flex-item-1',cur:tabs[2].isShow}" href="javascript:"><span class="tabNav-ico tabNav-home"></span><span class="tabNav-txt">首 页</span></a><script type="text/javascript">
toIndex: function(){this.$router.push("/?entityId="+ localStorage.getItem("entityId"));
</script>
}

10. 计算属性

  • 概述:一个提前定义好的方法, 该方法可以看作是一个特殊的值, 可以在插值表达式中使用。

  • 语法

 var app = new Vue({el:"#app",//计算属性必须放在Vue的computed中computed:{//定义计算属性属性名(){return "返回值";}}
});
  • 示例
<div id="app"><h1>{{birth}}</h1><h1 v-text="birth"></h1><h1 v-html="birth"></h1>
</div>
<script type="text/javascript">var app = new Vue({el:"#app",computed:{//定义一个birth方法,该方法就是一个计算属性,可以在插值表达式中使用birth(){let date = new Date();let year = date.getFullYear();let month = date.getMonth()+1;let day = date.getDay();return year + "-" + month + "-" + day;}}});
</script>

11. watch监控

  • 概述:watch可以监听简单属性值及其对象中属性值的变化。
    watch类似于onchange事件,可以在属性值修改的时候,执行某些操作。

  • 语法

var app = new Vue({el:"#app",data:{message:"XXX",person:{"name":"heima", "age":13}},//watch监听watch:{//监听message属性值,newValue代表新值,oldValue代表旧值message(newValue, oldValue){console.log("新值:" + newValue + ";旧值:" + oldValue);},//监控person对象的值,对象的监控只能获取新值person: {//开启深度监控;监控对象中的属性值变化deep: true,//获取到对象的最新属性数据(obj代表新对象)handler(obj){console.log("name = " + obj.name + "; age=" + obj.age);}}}
});

三、Vue组件

1. 简介

组件, 类似于模版, 模块. 在项目需要重用某个模块(头部、尾部、新闻。。。)的时候,可以将模块抽取成组件,其它页面中注册组件并引用。

<div id="app"><!--使用组件(组件名称),如果组件名称中有大写字母,如"myList",则这里需要书写<my-list>--><counter></counter><counter></counter>
</div>
<script type="text/javascript">//定义组件const counterTemp = {//定义组件的模版template:`<button @click='num++'>你点击了{{num}}次</button>`,//定义组件中使用到的数据属性data(){return {num:0}} };    //全局注册组件:在所有的vue实例中都可以使用组件//参数1:组件名称,参数2:具体的组件//Vue.component("counter", counterTemp);var app = new Vue({el:"#app",//局部注册组件: 只能在当前Vue实例中使用components:{//组件名称:具体组件counter: counterTemp}});
</script>

注意:

组件的模版中, 只能书写一个根标签
组件的定义必须放在Vue创建对象之前, 否则加载失败会报错

2. 父组件向子组件通信

  • 概述

    子组件无法直接使用父组件中的数据, 如果需要使用, 则必须由父组件把数据传递给子组件才可以。
    本质: 让子组件中的属性与父组件中的属性进行关联绑定, 然后子组件使用该属性, 这样才能做到数据传递。

  • 作用:可以把父组件中的数据, 更新传递到子组件。

  • 示例

<div id="app"><!-- 把父组件中的count传递给子组件的number属性,把父arr传递给子ids,把父p传递给子person --><aaa :number="count" :ids="arr" :person="p"></aaa>
</div><script>var aaa = {//定义组件的模版template: `<h2>{{num}}---{{number}}--{{ids}}--{{person}}</h2>`,//定义组件中使用到的数据属性data() {return {num: 0}},//给组件添加属性props: {//普通属性numbernumber: "",//数组属性idsids: [],//对象属性personperson: {}/**	//以上属性还可以书写为以下格式*	items:{*        //数据类型,如果是数组则是Array,如果是对象则是Object*       type:Array,*       //默认值*       default:[]*	}*/}};//注册:全局注册Vue.component("aaa", aaa);var app = new Vue({el: "#app",data: {count: 5,arr: [1, 2, 3],p: {username: "zhangsan", age: 23}}});
</script>

3. 子组件向父组件通信

  • 概述

    子组件无法直接给父组件传递数据,也无法操作父组件中的数据,更无法调用父组件中的方法。
    所以,所谓的子组件向父组件通讯,其实就是想办法让子组件调用父组件的方法,进而响应到父组件中的数据。

  • 作用:子组件可以调用父组件中的方法

  • 示例

<div id="app"><h1>父组件中:app_num={{app_num}}</h1><!-- 把父组件的add方法,绑定给子组件的aaa属性,绑定方法使用@属性名="方法名" --><!-- 把父组件的rem方法,绑定给子组件的bbb属性,绑定方法使用@属性名="方法名 --><!-- 把父组件的app_num变量,绑定给子组件的counter_num属性,绑定变量使用:属性名="方法名 --><counter @aaa="add" @bbb="rem" :counter_num="app_num"></counter>
</div><script>//定义一个组件(模版)let counter = {template: `<div><h1>子组件中:counter_num={{counter_num}}</h1><input type="button" @click="fun1" value="+"/><input type="button" @click="fun2" value="-"/></div>`,props:{//定义属性counter_num,用来接收父组件传递的数据counter_num:null,//定义aaa属性,用来绑定父组件的方法,当然,该定义也可以省略aaa:function(){},//定义bbb属性,用来绑定父组件的方法,当然,该定义也可以省略bbb:function(){},},       methods:{fun1(){//找到aaa属性所绑定的那个方法,执行那个方法return this.$emit("aaa");},fun2(){//找到bbb属性所绑定的那个方法,执行那个方法return this.$emit("bbb");}}}var app = new Vue({el: '#app',data: {app_num: 0},components: {counter},methods:{add(){this.app_num++;},rem(){this.app_num--;}}});
</script>

四、axios异步请求

Promise是异步编程的一种解决方案。从语法上讲,Promise是一个对象,它可以获取异步操作的消息。主要是解决地狱回调的问题。

1. axios概述

axios是一个基于 Promise 的 HTTP 库,主要用于,发送异步请求,获取数据。
可以用在浏览器和 node.js 中,axios的github

  1. 常见的方法:
  • axios(config)
  • axios.get(url, [config])
  • axios.post(url, [data])
  1. 为方便起见,为所有支持的请求方法提供了别名

axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])

  1. 发送数据常用参数:
{url: '请求的服务器',method: '请求方式', // 默认是 get// GET请求参数params: {参数名: 参数值},// POST请求参数, 如果使用axios.post,则参数在url之后直接书写,不需要该位置传递参数data: {参数名: 参数值},// 响应数据格式,默认jsonresponseType: 'json'
}
  1. 响应数据常用参数:
{data: {},		//真正的响应数据(响应体)status: 200,	//响应状态码statusText: 'OK',	 //响应状态描述headers: {},	//响应头config: {}		//其他配置信息
}

2. Get请求

var app = new Vue({el: "#app",data: {user: {}},//当页面加载完毕后created() { //发送GET请求axios.get("请求路径",{ config });axios.get("请求路径",{//get请求参数params: {name:"zhangsan",age:23},//响应数据格式为"json"responseType: 'json'}).then(res => {//打印响应数据console.log(res);//把响应数据赋值给Vue中的user属性app.user = res.data;}).catch(err => {//打印响应数据(错误信息)console.log(err);});}
});

3. Post请求

var app = new Vue({el: "#app",data: {user: {}},//当页面加载完毕后created() { //发送POST请求axios.post("请求路径",{ 参数 });axios.post("请求路径",{name:"zhangsan",age:23}).then(res => {console.log(res);app.user = res.data;}).catch(err => {console.log(err);});}
});

4. 跨域请求

跨域请求:在前端js中如果发送异步请求的话,请求的地址与当前服务器的ip或者端口号不同都是跨域请求。

跨域请求需要在服务提供方, 开启允许跨域请求。

跨域请求

5. vue-resource

vue-resource是Vue.js的插件提供了使用XMLHttpRequest或JSONP进行Web请求和处理响应的服务。 当vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,在这里知道vue-resource就可以。
vue-resource的github

五、综合案例

需求:完成用户的查询与修改操作

  1. html

  2. js

var vue = new Vue({el: "#app",data: {user: {id:"",username:"aaa",password:"",age:"",sex:"",email:""},userList: []},methods: {findAll: function () {var _this = this;axios.get("/vuejsDemo/user/findAll.do").then(function (response) {_this.userList = response.data;console.log(_this.userList);}).catch(function (err) {console.log(err);});},findById: function (userid) {var _this = this;axios.get("/vuejsDemo/user/findById.do", {params: {id: userid}}).then(function (response) {_this.user = response.data;$('#myModal').modal("show");}).catch(function (err) {});},update: function (user) {var _this = this;axios.post("/vuejsDemo/user/update.do",_this.user).then(function (response) {_this.findAll();}).catch(function (err) {});}},created(){this.findAll();}
});

本文的引用仅限自我学习如有侵权,请联系作者删除。
参考知识
Vue学习之从入门到神经
《Vue入门到精通系列》— 两万字带你入门Vue
vue.js 三种方式安装(vue-cli)


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

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

相关文章

Spring 的依赖注入DI是什么?

口语化答案好的&#xff0c;面试官&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是Spring框架实现控制反转&#xff08;IoC&#xff09;的主要手段。DI的核心思想是将对象的依赖关系从对象内部抽离出来&#xff0c;通过外部注入的方式提…

汇川PLC通过ModbusTCP转Profinet网关连接西门子PLC配置案例

本案例是汇川的PLC通过开疆智能研发的ModbusTCP转Profient网关读写西门子1200PLC中的数据。汇川PLC作为ModbusTCP的客户端网关作为服务器&#xff0c;在Profinet一侧网关作为从站接收1200PLC的数据并转成ModbusTCP协议被汇川PLC读取。配置过程&#xff1a;汇川PLC配置Modbus TC…

【计组】数据的表示与运算

机器数与真值机器数真值编码原码特点表示范围求真值方法反码特点补码特点表示范围求真值方法移码特点表示范围求真值方法相互转换原码<->补码补码<->移码原码<->反码反码<->补码移位左移右移逻辑右移算术右移符号扩展零扩展整数小数符号扩展运算器部件…

视频水印技术中的变换域嵌入方法对比分析

1. 引言 随着数字视频技术的快速发展和网络传输的普及,视频内容的版权保护问题日益突出。视频水印技术作为一种有效的版权保护手段,通过在视频中嵌入不可见或半可见的标识信息,实现对视频内容的所有权认证、完整性验证和盗版追踪。在视频水印技术的发展历程中,变换域水印因…

电动汽车电池管理系统设计与实现

电动汽车电池管理系统设计与实现 1. 引言 电动汽车电池管理系统(BMS)是确保电池组安全、高效运行的关键组件。本文将详细介绍一个完整的BMS系统的MATLAB实现,包括状态估计(SOC/SOH)、参数监测、电池平衡和保护功能。系统设计为模块化结构,便于扩展和参数调整。 2. 系统架构…

JVM(Java Virtual Machine,Java 虚拟机)超详细总结

一、JVM的基础概念1、概述JVM是 Java 程序的运行基础环境&#xff0c;是 Java 语言实现 “一次编写&#xff0c;到处运行” &#xff08;"write once , run anywhere. "&#xff09;特性的关键组件&#xff0c;具体从以下几个方面来理解&#xff1a;概念层面JVM 是一…

Balabolka软件调用微软离线自然语音合成进行文字转语音下载安装教程

首先&#xff0c;需要准备安装包 Balabolka NaturalVoiceSAPIAdapterMicrosoftWindows.Voice.zh-CN.Xiaoxiao.1_1.0.9.0_x64__cw5n1h2txyewy.Msix MicrosoftWindows.Voice.zh-CN.Yunxi.1_1.0.4.0_x64__cw5n1h2txyewy.Msix借助上面这个工具&#xff1a;NaturalVoiceSAPIAdapter&…

Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码解析 推荐视频&#xff1a; 黑马程序员全套Java教程_哔哩哔哩 尚硅谷Java入门视频教程_哔哩哔哩 推荐书籍&#xff1a; 《Ja…

接口测试用例和接口测试模板

一、简介 3天精通Postman接口测试&#xff0c;全套项目实战教程&#xff01;&#xff01;接口测试区别于传统意义上的系统测试&#xff0c;下面介绍接口测试用例和接口测试报告。 二、接口测试用例模板 功能测试用例最重要的两个因素是测试步骤和预期结果&#xff0c;接口测试…

linux查看kafka的消费组里是否有积压

flink消费数据时&#xff0c;有时候需要在页面展示的数据&#xff0c;不能实时展示。那就需要查看下&#xff0c;kafka的消费组里是否有数据积压了。flink的任务flink的消费情况kafka中的信息总结可以看出来&#xff0c;kafka的消费组里的数据&#xff0c;已经实时的消费完了。…

【Unity笔记】Unity 音游模板与免费资源:高效构建节奏游戏开发全指南

Unity 音游模板与免费资源&#xff1a;高效构建节奏游戏开发全指南 文章摘要&#xff1a; 本文为Unity开发者提供一套针对下落式与轨道式音乐游戏的实用模板工程与免费资源指南&#xff0c;内容涵盖项目目录结构、核心功能模块、视觉特效与音效素材、开源脚本框架及辅助打谱工具…

【RabbitMQ】高级特性—持久性、重试机制详解

持久性 我们在前面说了消息端处理消息时&#xff0c;消息如何不丢失&#xff0c;但是如何保证当 RabbitMQ 服务器停掉之后&#xff0c;生产者发送的消息不丢失呢&#xff1f; 默认情况下&#xff0c;RabbitMQ 退出或者由于某种原因崩溃时&#xff0c;会忽视队列和消息&#xff…

零基础人工智能学习规划之路

一、引言&#xff1a;为什么选择人工智能&#xff1f;人工智能&#xff08;AI&#xff09;是当前科技领域最炙手可热的方向之一&#xff0c;涵盖机器学习、深度学习、计算机视觉、自然语言处理等多个分支。无论是就业市场的高需求&#xff0c;还是技术改变生活的潜力&#xff0…

【科研绘图系列】R语言绘制误差棒图

文章目录 介绍 加载R包 数据下载 导入数据 数据预处理 画图 系统信息 参考 介绍 【科研绘图系列】R语言绘制误差棒图 加载R包 library(tidyverse) library(ggplot2) library(ggsignif) library(RColorBrewer) library(waterfalls) library(reshape2

期权定价全解析:从Black-Scholes到量子革命的金融基石

在金融市场中,期权定价如同航海中的罗盘,为风险定价提供方向。本文将深入剖析期权定价的核心逻辑、应用场景及量子计算带来的颠覆性变革,并附实战代码示例。 一、期权定价的本质:风险的时间价值 1. 核心公式解析 C = e^{-rT}\mathbb{E}^\mathbb{Q}[\max(S_T-K,0)] C:期权…

实现div内容的垂直居中

Flexbox 弹性盒子&#xff08;推荐&#xff09; div {display: flex;align-items: center; /* 垂直居中 */justify-content: center;/* 水平居中 */height: 300px; /* 需要指定高度 */ }✅ 现代浏览器首选方案&#xff0c;支持响应式布局 Grid 网格布局 div {displ…

Juc高级篇:可见性,有序性,cas,不可变,设计模式

目录 一.Java内存模型 1.可见性 1.1设计模式 (1.1.1)两阶段终止 (1.1.2)Balking模式 2.有序性 3.volatile原理 3.1保证可见性与有序性 3.2单例模式DCL 3.3 happens-before规则 4.线程安全单例 4.1饿汉式 二.无锁并发 1.原子整数 2.原子引用 2.1 AtomicReference…

JDK源码

java.util.concurrent 以下是atomic包下的 AtomicInteger Unsafe类&#xff1a;提供的方法可以直接访问内存、线程。 属性&#xff1a;Unsafe、int value 通过Unsafe方法中的CAS循环&#xff0c;保证int类型值的原子操作 int var5; do {var5 this.getIntVolatile(var1, var2);…

Linux网络编程【基于UDP网络通信的字典翻译服务】

1. 基本框架&#xff1a;前面我们已近完成了&#xff0c;基于UDP协议的网络通信&#xff0c;但是我们服务器接收到来自客户端的信息即字符串时只是进行了简单的发送会客户端和在日志中回显打印&#xff0c;并没有实际的业务服务。那么接下来&#xff0c;我们就设计一个字典翻译…

Quality Control II: Trimming (二):BBDuk

参考&#xff1a;BBDuk Guide - Archive 在我们了解了如何使用trimmomatic之后&#xff0c;我们开始进一步了解另外一种trim工具BBDuk 首先小编要声明&#xff1a;如果想要完全掌握一个工具是需要较长时间的钻研和学习的&#xff0c;这里呢只是提供BBDuk处理数据的基本逻辑和…