作为后端程序员,了解和掌握一些前端知识也是必不可少的,本章就和大家分享Vue的一些基础知识,希望能够对Vue小白有所帮助。话不多说,下面我们直接进入主题。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue简介</title>
<script src="lib/vue.js"></script>
</head>
<body>
<!-- Vue实例所控制的这个元素区域,就是我们 MVVM 中的 V(View视图) -->
<div id="app">
<!-- 插值表达式 -->
{{ msg }}
</div>
<script>
//Vue简介:1、JavaScript框架;2、简化Dom操作;3、响应式的数据驱动(页面是由数据来生成的,当数据改变以后页面会同步的更新)
//我们 new 出来的这个 vm 对象,就是我们 MVVM 中的 VM调度者
var vm = new Vue({
//el挂载点:
//1、Vue实例的作用范围是什么呢?答:Vue会管理el选项命中的元素及其内部的后代元素。
//2、是否可以使用其他的选择器?答:可以使用其他的选择器,但是建议使用ID选择器。
//3、是否可以设置在其他的Dom元素上呢?答:可以使用其他的双标签,但不能使用 html 或 body 标签。
el: '#app', //挂载点,支持所有的选择器,推荐使用ID选择器,不能挂载在 html 或 body 标签上,且不能挂载在单标签上
//这里的 data 就是 MVVM 中的 M(Model数据对象),专门用来保存每个页面的数据
data: {
msg: 'Hello Vue!'
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue指令</title>
<script src="/lib/vue.js"></script>
<style>
.active {
border: 1px solid red;
}
</style>
</head>
<body>
<div id="app">
<!-- v-text指令的作用是:设置标签的文本值(textContent) -->
<!-- 默认写法会替换全部内容,使用插值表达式 {{ }} 可以替换指定的内容 -->
<!-- 内部支持写表达式 -->
<div desc="v-text指令">
<h2 v-text="msg + ' 你好Vue! ' + language.chinese">这里的内容会被v-text指令替换掉</h2>
<h2>{{ msg + ' 你好Vue! ' + language.chinese }}</h2>
</div>
<!-- v-html指令的作用是:设置元素的innerHTML -->
<!-- v-html指令内容中有html机构会被解析为标签,而v-text指令无论内容是什么只会解析为文本。 -->
<div desc="v-html指令">
<h2 v-html="url"></h2>
</div>
<!-- v-on指令的作用是:为元素绑定事件 -->
<!-- 事件名不需要写on,指令可以简写为@,绑定的方法定义在methods属性中,方法内部通过this关键字可以访问定义在data中的数据 -->
<div desc="v-on指令">
<input type="button" value="v-on指令" v-on:click="doTest">
<input type="button" value="v-on简写" @click="doTest">
<input type="button" value="双击事件" @dblclick="doTest">
<!-- 传递自定义参数 -->
<input type="button" value="v-on方法带2个参数" @click="doTest2('隔壁老王', 666)">
<!-- 事件修饰符:事件的后面跟上 .修饰符 可以对事件进行限制,.enter 可以限制触发的按键为回车 -->
<!-- 事件修饰符有多种,更多事件修饰符可参考官网:https://v2.cn.vuejs.org/v2/api/#v-on -->
<input type="text" @keyup.enter="doTest">
<h2 @click="changeFood">{{ food }}</h2>
</div>
<!-- v-show指令的作用是:根据真假切换元素的显示状态 -->
<!-- 原理是修改元素的display,实现显示或隐藏 -->
<!-- 指令后面的内容最终都会解析为布尔值,值为true元素显示,值为false元素隐藏 -->
<!-- 数据改变之后,对应元素的显示状态会同步更新 -->
<div desc="v-show指令">
<input type="button" value="v-show指令切换显示状态" @click="changeIsShow">
<input type="button" value="累加年龄" @click="addAge">
<div>
<img v-show="isShow" src="/imgs/monkey.jpg" alt="">
<img v-show="age>=18" src="/imgs/monkey.jpg" alt="">
</div>
</div>
<!-- v-if指令的作用是:根据表达式的真假切换元素的显示状态 -->
<!-- 本质是通过操纵dom元素来切换显示状态 -->
<!-- 表达式的值为true,元素存在于dom树中,值为false则从dom树中移除 -->
<!-- 频繁的切换使用v-show指令,反之使用v-if指令,前者的切换消耗小 -->
<div desc="v-if指令">
<input type="button" value="v-if指令切换显示状态" @click="toggleIsShow">
<p v-if="isShowInfo">浪子天涯</p>
<p v-show="isShowInfo">浪子天涯 - v-show修饰</p>
<h2 v-if="temperature>=30">热死了</h2>
</div>
<!-- v-bind指令的作用是:为元素绑定属性 -->
<!-- 完整写法是 v-bind:属性名 -->
<!-- 简写的话可以直接省略v-bind,只保留 :属性名 -->
<!-- 需要动态的增删class建议使用对象的方式 -->
<div desc="v-bind指令">
<img v-bind:src="imgSrc" alt="">
<img :src="imgSrc" :title="imgTitle" :class="isActive?'active':''" @click="toggleActive" alt="">
<img :src="imgSrc" :title="imgTitle" :class="{active: isActive}" @click="toggleActive" alt="">
</div>
<!-- v-for指令的作用是:根据数据生成列表结构 -->
<!-- 数组经常和v-for结合使用 -->
<!-- 语法是 (item,index) in 数据 -->
<!-- item 和 index 可以结合其他指令一起使用 -->
<!-- 数组长度的更新会同步到页面上,是响应式的 -->
<div desc="v-for指令">
<input type="button" value="添加数据" @click="add">
<input type="button" value="移除数据" @click="removeLeft">
<ul>
<li v-for="(item,index) in arr">
{{ index + 1 }} 校区:{{ item }}
</li>
</ul>
<h2 v-for="(item,index) in vegetables" :title="item.name">
{{ item.name }}
</h2>
</div>
<!-- v-model指令的作用是:便捷的设置和获取表单元素的值 -->
<!-- 绑定的数据会和表单元素的值相关联(双向数据绑定) -->
<div desc="v-model指令">
<input type="button" value="修改msg" @click="setMsg">
<input type="text" v-model="msg" @keyup.enter="getMsg">
<h2> {{ msg }} </h2>
</div>
</div>
<script>
var vm = new Vue({
el: '#app', //挂载
//数据
data: {
msg: 'Hello Vue!',
language: {
chinese: '汉语'
},
url: "<a href='https://www.baidu.com'>百度</a>", //百度超链接
food: "番茄炒鸡蛋",
isShow: false, //是否显示
age: 17, //年龄,
isShowInfo: false, //是否显示信息
temperature: 20, //温度
imgSrc: "/imgs/monkey.jpg", //图片地址
imgTitle: "浪子天涯", //标题
isActive: false,
vegetables: [ //蔬菜
{ name: "白菜" },
{ name: "萝卜" }
],
arr: ["北京", "上海", "广州", "深圳"], //城市
},
//方法
methods: {
//方法测试
doTest: function () {
var _this = this; //方法中通过this关键字获取data中的数据
alert(_this.language.chinese);
},
//带2个参数的方法测试
doTest2: function (p1, p2) {
console.log(p1);
console.log(p2);
},
//改变食物
changeFood: function () {
var _this = this; //方法中通过this关键字获取data中的数据
_this.food += "真好吃!";
},
//切换显示状态
changeIsShow: function () {
this.isShow = !this.isShow;
},
//累加年龄
addAge: function () {
this.age++;
},
//切换显示状态
toggleIsShow: function () {
this.isShowInfo = !this.isShowInfo;
},
//切换样式
toggleActive: function () {
this.isActive = !this.isActive;
},
//追加
add: function () {
this.vegetables.push({
name: "花菜"
});
},
//移除数组左边的第一个
removeLeft: function () {
this.vegetables.shift();
},
//获取msg
getMsg: function () {
alert(this.msg);
},
//设置msg
setMsg: function () {
this.msg = "程序员";
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>axios基本使用</title>
<script src="/lib/vue.js"></script>
<script src="/lib/axios.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="获取信息" @click="getMsg">
<p> {{ msg }} </p>
</div>
<script>
//get请求 .then后面跟着是成功的回调函数和失败的回调函数
//axios.get(地址?key=value&key2=value2).then(function(response){},function(err){});
//post请求 .then后面跟着是成功的回调函数和失败的回调函数
//axios.post(地址,参数对象).then(function(response){},function(err){});
//axios.post(地址,{key:value,key2:value2}).then(function(response){},function(err){});
/*
axios官网地址:http://axios-js.com/zh-cn/docs/
案例如下:
1、执行 GET 请求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
2、执行 POST 请求
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
3、执行多个并发请求
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// 两个请求现在都执行完成
}));
*/
var vm = new Vue({
//挂载
el: '#app',
//数据
data: {
msg: 'Hello Vue!'
},
//方法
methods: {
//获取信息
getMsg: function () {
var _this = this;
axios.get('https://autumnfish.cn/api/joke').then(function (response) {
//成功的回调
//axios回调函数中的this已经改变,无法访问到data中的数据
//把this保存起来,回调函数中直接使用保存的this即可,也就是此处的_this
_this.msg = response.data;
}, function (err) {
//失败的回调
//TODO
});
},
/* 执行多个并发请求示例开始 */
//添加配件价格信息
addPartsPrice: function (drs) {
var _this = this;
var arrPids = [];
drs.forEach(function (item, index) {
if (!arrPids.some(pid => { return pid == item.pid; })) {
arrPids.push(item.pid);
}
});
if (arrPids.length <= 0) {
return;
}
var pageSize = 10; //分页大小
var pageResults = []; //分组结果
for (var i = 0; i < arrPids.length; i += pageSize) {
//slice(start,end) 获取索引值从start到end的数据,其中包含start,但不包含end
pageResults.push(arrPids.slice(i, i + pageSize)) // 每10条分成一组
}
var arrGetListPartsPriceBy007Func = []; //存放获取原厂配件列表销售价(含税)数据的函数
pageResults.forEach(function (arr, index) {
var pids = "";
arr.forEach(function (pid) {
pids += pid + ",";
});
arrGetListPartsPriceBy007Func.push(_this.getListPartsPriceBy007(pids));
});
//分多批次获取数据,防止后端响应时间超时
var pAll = Promise.all(arrGetListPartsPriceBy007Func).then(results => {
//results为一个数组,存放的是arrGetListPartsPriceBy007Func中每个函数的返回值
//console.log(results);
var dt = []; //用于存放所有请求的返回值,此处每个接口的返回值都是json数组
results.forEach(function (arr) {
dt = dt.concat(arr); //合并数组
});
//console.log(dt);
if (dt && dt.length > 0) {
drs.forEach(function (dr, index) {
var filterResult = dt.filter(function (item, index2) {
return item.pid == dr.pid;
});
if (filterResult.length > 0) {
//this.$set()用于向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。
//它必须用于向响应式对象上添加新属性,因为Vue无法探测普通的新增属性。
_this.$set(dr, "eot_price", filterResult[0].eot_price); //进价(未含税)
_this.$set(dr, "cost_price", filterResult[0].cost_price); //进价(含税)
_this.$set(dr, "sale_price", filterResult[0].sale_price); //销售价(含税)
}
});
}
}).catch(error => { //Promise中只要有一个reject了,那么pAll的状态就是reject
//console.log(error);
});
},
//获取原厂配件列表销售价(含税)数据
//pids:配件编码,多个以英文逗号分割
getListPartsPriceBy007: function (pids) {
var _this = this;
//其中调用 resolve 代表一切正常,reject 是出现异常时所调用的
//resolve() 中可以放置一个参数用于向下一个 then 传递一个值
//reject() 参数中一般会传递一个异常给之后的 catch 函数用于处理异常
//resolve 和 reject 并不能够使起始函数停止运行,别忘了 return。
return new Promise(function (resolve, reject) {
var apiData = []; //接口返回的数据
var params = new URLSearchParams();
params.append("action", "GetListPartsPriceBy007");
params.append("brandCode", _this.globalBrandCode);
params.append("pids", pids);
axios.post('/Ashx/Epc/ThirdInterfaceDataHandler.ashx', params)
.then(function (result) {
if (result.data.State != 1) { //获取失败
console.log("获取原厂配件列表销售价(含税)数据失败:" + result.data.Message);
resolve(apiData);
return;
}
//_c.getKeyValue 为自己封装的一个函数,可根据各自业务做相应的调整
apiData = JSON.parse(_c.getKeyValue('data', result.data.Items));
resolve(apiData); //此处也可将接口返回来的值存到全局变量中
})
.catch(function (error) {
//reject(error); //拦截
console.log(error);
resolve(apiData);
});
});
},
/* 执行多个并发请求示例结束 */
},
})
</script>
</body>
</html>
js中最常用的几个数组操作方法 filter、map、forEach、every、some、sort、this.$set() 实际案例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>js中常用的json数组操作方法</title>
<script src="lib/vue.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="测试" @click="doTest">
</div>
<script>
var vm = new Vue({
el: '#app', //挂载
data: {
msg: 'Hello Vue!',
persons: [
{
name: "张三", age: 18, id: 5, gender: "男"
},
{
name: "李四", age: 20, id: 2, gender: "男"
},
{
name: "王五", age: 16, id: 2, gender: "男"
},
{
name: "小美", age: 16, id: 9, gender: "女"
},
]
},
methods: {
//测试
//参考博文:https://blog.csdn.net/weixin_42708208/article/details/103506187
//filter、map、forEach、every、some、sort、this.$set() 使用
doTest: function () {
var _this = this; //方法中通过this关键字获取data中的数据
//具体案例如下:
//1、返回所有年龄大于等于18岁的男生的数组(使用方法:filter)
var mans = _this.persons.filter((item, index) => {
return item.gender == "男" && item.age >= 18
});
console.log("年龄大于等于18岁的男生:", mans);
//2、只保留姓名的数组(使用方法:map)
var personNameList = _this.persons.map((item, index) => {
return item.name;
});
console.log("只保留姓名的数组:", personNameList);
//3、只保留姓名和id的数组(使用方法:forEach)
var personNameIdList = [];
_this.persons.forEach((item, index) => {
personNameIdList.push({ name: item.name, id: item.id });
});
console.log("只保留姓名和id的数组:", personNameIdList);
//4、判断所有人是不是都是男生(使用方法:every)
var isMan = _this.persons.every((item, index) => {
return item.gender == "男";
});
console.log("判断所有人是不是都是男生:", isMan); //false
//5、判断有没有男生(使用方法:some)
var hasMan = _this.persons.some((item, index) => {
return item.gender == "男";
});
console.log("判断有没有男生:", hasMan); //true
//6、依据id进行升序排序,操作的是原数组(使用方法:sort)
_this.persons.sort(function (a, b) { return a.id - b.id; });
console.log("依据id进行升序排序:", _this.persons);
//7、给年龄大于等于18的人添加字段type:'成年人'
_this.persons.forEach(function (item) {
if (item.age >= 18) {
//this.$set()用于向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。
//它必须用于向响应式对象上添加新属性,因为Vue无法探测普通的新增属性。
_this.$set(item, "type", "成年人");
}
});
console.log("给年龄大于等于18的人添加字段type:'成年人':", _this.persons);
},
},
})
</script>
</body>
</html>
Demo源码:
链接:https://pan.baidu.com/s/1plm0nc8BylZVj05wJ7y4Yg
提取码:hpoy
此文由博主精心撰写转载请保留此原文链接:https://www.cnblogs.com/xyh9039/p/16950971.html
版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍 介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。 内容有: ①:Hub模型的方法介绍 ②:服务器端代码介绍 ③:前端vue3安装并调用后端方法 ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke() 去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
目录1关系运算符2运算符优先级3关系表达式的书写代码实例:下面是面试中可能遇到的问题:1关系运算符C++中有6个关系运算符,用于比较两个值的大小关系,它们分别是:运算符描述==等于!=不等于小于>大于小于等于>=大于等于这些运算符返回一个布尔值,即true或false。例如,当x等于y时,x==y的结果为true,否则结果为false。2运算符优先级在C++中,关系运算符的优先级高于赋值运算符,但低于算术运算符。以下是关系运算符的优先级,从高到低排列:运算符描述>,,>=,关系运算符==,!=相等性运算符&&逻辑与`如果在表达式中有多个运算符,则按照优先级顺序依次进行运算。3关系表达式的书写在
一.计算机组成原理 这本书利用组合逻辑、同步时序逻辑电路设计的相关知识,从逻辑门开始逐步构建运算器、存储器、数据通路和控制器,最终集成为完整的CU原型系统,使读者从设计者的角度理解计算机部件构成及运行的基本原理,掌握软硬件协同的概念。 全书共9章,主要内容包括计算机系统概述、数据信息的表示、运算方法与运算器、存储系统、指令系统、中央处理器、指令流水线、总线系统、输入输出系统。1.计算机系统概述1.1计算机发展历程 计算机是一种能够按照事先存储的程序,自动、高速、准确地对相关信息进行处理的电子设备。1946年2月,世界上第一台电子数字计算机ENIAC(ElectronicNum