Java框架(Vue)学习笔记
1、vue概述
1.1 Vue基本概念
Vue.js是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑 定和组合的视图组件。它不仅易于上手,还便于与第三方库或既有项目整合。
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
1.3 Vue入门案例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>快速入门</title> <script src="http://9i0i.com/pic.php?p=vuejs-2.5.16.js"></script> </head> <body> <div id="app"> {{message}} </div> <script> var app = new Vue({ el:"#app", //表示要控制的区域 data:{//存放el中要用到的数据,是M,用来保存每个页面的数据 message:"Hello world!" } }); </script> </body> </html>
1.4 插值表达式
数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值,Mustache 标签将会被替代为对应数据对象上属性的值。无论何时,绑定的数据对象上属性发生了改变,插值处的内容都会更新。
Vue.js 都提供了完全的 JavaScript 表达式支持。
表达式的定义: {{Expressions}}
- 支持加减乘除四则运算
- 支持逻辑运算
- 支持三目运算符
{{ number + 1 }} {{ ok ? 'YES' : 'NO' }}
这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个 表达式,所以下面的例子都不会生效。
<!-- 这是语句,不是表达式 --> {{ var a = 1 }} <!-- 流控制也不会生效,请使用三元表达式 --> {{ if (ok) { return message } }}
2、常用指令
2.1 v-text指令(文本)
v-text会覆盖元素中原本的内容,但是插值表达式,只会替换自己的占位符,不会把整个元素的内容清空。
表达式v-text存在问题:对于值当中存在html元素时,不能渲染成html元素,只能渲染成普通字符串。
<body> <div id="app"> <p v-text="message1">h1</p> <p >{{message1}}</p> <p v-text="message2"></p> <p>{{message2}}</p> </div> <script> var app = new Vue({ el:"#app", //表示要控制的区域 data:{//存放el中要用到的数据,是M,用来保存每个页面的数据 message1:"Hello Amy!", message2:"<h1>Hello world!</h1>" } }); </script> </body>s
2.2 v-html指令(innerHTML)
v-html,更新元素的innerHTML。
注意:内容按普通注意:内容按普通 HTML 插入 – 不会作为 Vue 模板进行编译 。
<body> <div id="app"> <p v-text="message2"></p> <p v-html="message2"></p> </div> <script> var app = new Vue({ el:"#app", data:{ message1:"Hello Amy!", message2:"<h1>Hello world!</h1>" } }); </script> </body>
2.3 v-bind指令(属性)
v-bind:Vue中用于绑定属性的指令
- 实现数据的单向绑定,从M绑定到V,不能实现双向绑定
- v-bind会把值当成是js的表达式去处理,可以写合法的表达式
- 语法格式:v-bind:属性名=”model名” ,可以简写成: 属性形式
- ※ V-bind只能实现数据的单向绑定,从M绑定到V,不能实现双向绑定。
<body> <div id="app"> <p v-bind:title="message1">绑定属性,请使用浏览器工具查看title属性</p> </div> <script> var app = new Vue({ el:"#app", data:{ message1:"我是新的title" } }); </script> </body>
v-bind的简写格式
<a v-bind:href="urlx">v-bind的完整格式</a> <a :href="urlx">v-bind的简写格式</a>
2.4 v-model指令(表单)
运用在表单元素当中,实现数据的双向绑定,从V->M,或从M->V .
v-model会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。使用时应该通过 JavaScript 在组件的 data 选项中声明初始值。
<body> <div id="app"> <p>{{message}}</p> <input v-model="message" size="50"> </div> <script> var app = new Vue({ el:"#app", data:{ message:"我就是我,不一样的烟火" } }); </script> </body>
2.5 v-on指令(事件)
可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。
- 绑定事件监听器。事件类型由参数指定。
- 表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。可以缩写成@
- 需要在Vue对象中通过methods属性定义事件处理方法。
- 用在普通元素上时,只能监听原生DOM事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。
- ※ 不能在v-on属性中直接写JS代码
v-on:click
<body> <div id="app"> <p>{{message}}</p> <button v-on:click="fun('good')">坐看云起时</button> </div> <script> var app = new Vue({ el:"#app", data:{ message:"我就是我,不一样的烟火,不要想改变我" }, methods:{ fun:function(msg){ this.message=msg; } } }); </script> </body>
按键修饰符
Vue 允许为 v-on 在监听键盘事件时添加按键修饰符。
- .enter
- .tab
- .delete (捕获 “删除” 和 “退格” 键)
- .esc
- .space
- .up
- .down
- .left
- .right
- .ctrl
- .alt
- .shift
- .meta
<body> <div id="app"> <input type="text" @keyup.enter="fun1"> </div> <script> new Vue({ el:'#app', methods:{ fun1:function(){ alert("按了Enter键"); } } }); </script> </body>
简写形式
<!-- 完整语法 --> <a v-on:click="doSomething">...</a> <!-- 缩写 --> <a @click="doSomething">...</a>
3、条件语句与循环语句
3.1 v-if 和v-show
指令v-if、v-else、v-else-if用于条件控制,根据表达式的值来决定是否渲染元素。v-if: 每次都都删除或创建元素。 有较高的切换性能消耗。涉及到频繁的切换,最好不要使用v-if。
v-show指令:不会重新进行DOM的删除、创建操作,只是切换了display csss属性。有较高的初始渲染消耗。当元素可能永远不会显示给用户,则使用v-if。
<body> <div id="app"> <div v-if="level=='A'">我是Amy</div> <div v-else-if="level=='B'">我是Belly</div> <div v-else-if="level=='C'">我是Cindy</div> <div v-else>我是我自己,不是其他任何谁</div> <div v-show="flag">放我出来,你们这些妖孽</div> <button @click="toggle">切换</button> </div> <script> new Vue({ el:'#app', data:{ level:'D', flag:false }, methods:{ toggle:function(){ this.flag = !this.flag; } } }); </script> </body>
3.2 v-for
循环使用 v-for 指令:需要以 item in items 形式的特殊语法。
- 迭代数组:items 是源数据数组并且 item 是数组元素迭代的别名。
- 迭代对象:Items可以是对象,迭代属性。Item可以为value,key,index格式,默认为value。
- 迭代整数:Items 可以是整数,迭代1~n之间的整数。
- 迭代字符串:items为字符串,迭代字符串中的每个字母,会去掉开头和结尾的空格符。
<body> <div id="app"> <h3>迭代数字</h3> <span v-for="n in 5">{{n}},</span> <h3>迭代数组</h3> <table> <tr v-for="itemx in arrary"> <td>{{itemx.name}}</td> </tr> </table> <h3>迭代对象</h3> <p v-for="attr in people">{{attr}} </p> <p v-for="(value, key,index) in people">{{index}}:{{key}}:{{value}} </p> <h3>迭代字符串</h3> <span v-for="item in sentence">{{item}}</span> </div> <script> new Vue({ el:'#app', data:{ arrary:[{name:'xiaoming'},{name:'xiaofei'},{name:'tingting'}], people:{name:'Amy',age:15,sex:'女'}, sentence:" I go to school every day " } }); </script> </body>
4、VUE的组件
7.1 什么是组件
组件的出现,是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,去调用相应的组件即可。
组件和模块化的区别:
模块化:是从代码逻辑角度划分的,方便代码分层开发,保证每个功能模块的职能单一。
组件:是从UI界面的角度划分的,前端组件化,方便UI的重用。
7.2 组件的定义方式
组件的命名方式
①kebab-case,单词之间采用 – (短横线)连接,例如:my-component ,在DOM中使用时,
②PascalCase,驼峰式名称,单词之间,首字母大写,例如:MyComponent,但是在DOM中使用时,必须更改为,,是识别不了的。
a. 定义全局组件
1:通过Vue.extend()和Vue.component()注册
使用Vue.extend定义组件对象,并使用Vue.component(‘组件名’,组件对象)来注册组件
※※无论使用何种方式,创建出来的元素必须有且仅有一个根元素。
<body> <div id="app"> <my-com1></my-com1> </div> </body> <script> //使用Vue.extend来创建全局组件 var com1 = Vue.extend({ template:"<h3>我是新组件</h3>" }); //使用Vue.component('组件名',组件对象)声明组件; Vue.component("myCom1",com1); new Vue({ el:'#app' }); </script>
2:直接使用 Vue.component 方法
Vue.component(‘register’, { template: “组件展示的内容” })
<body> <div id="app"> <my-com1></my-com1> </div> </body> <script> Vue.component("myCom1",{template:"<h3>我是新组件-小V</h3>"}); new Vue({ el:'#app' }); </script>
3:通过template模板方式
※:template模板需定义在Vue的控制范围外
<body> <div id="app"> <mycom1></mycom1> </div> <template id="temp1"> <div> <h3>凉州词</h3> <h3>望洞庭</h3> </div> </template> </body> <script> Vue.component("mycom1",{ template:"#temp1" }); new Vue({ el:'#app' }); </script>
b. 定义私有组件
局部组件定义在vue实例内部,该组件只能在vue实例控制范围内才能使用
定义方法:使用components属性定义组件
<body> <div id="app"> <cmp1></cmp1> <cmp2></cmp2> </div> <template id="cmp2template"> <h1>我的私有组件二</h1> </template> </body> <script> new Vue({ el:'#app', components:{ "cmp1":{template:"<h1>我的私有组件一</h1>"}, "cmp2":{template:"#cmp2template"} } }); </script>
c. 组件中的数据(data)
- 组件中可以有自己的data属性。
-
组件中的data是一个funciton,且需要通过return返回一个对象。
<script> Vue.component("cmp1",{ template:"<div>我是组件1---{{msg}}</div>", data:function(){ return {msg:"我是组件的data"} } }); Vue.component("cmp2",{template:"<div>我是组件2</div>"}); new Vue({ el:"#app" }); </script>
5、VUE的ajax的案例
简介
vue本身不支持发送AJAX请求,需要使用vue-resource、axios等插件实现。
axios是一个基于Promise的HTTP请求客户端,用来发送请求,也是vue2.0官方推荐的,同时不再对vue-resource进行更新和维护。
基本使用
语法规则:axios([options])
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2>Hello World!</h2> <div id="app"> <input type="button" value="查询用户" @click="getMsg"> {{ msg }} <table> <tr><td>编号</td><td>姓名</td><td>生日</td></tr> <tr v-for="value in msg"><td>{{value.id}}</td><td>{{value.name}}</td> <td>{{value.birth}}</td></tr> </table> </div> <script src="http://9i0i.com/pic.php?p=${pageContext.request.contextPath}/jquery/vuejs-2.5.16.js"></script> <script src="http://9i0i.com/pic.php?p=${pageContext.request.contextPath}/jquery/axios.js"></script> <script> new Vue({ el:"#app", data:{ msg:"msg111" }, methods:{ getMsg:function(){ var that = this; // alert(1); axios({ method:"get", url:"users", }).then(function(response){ console.log(response.data); that.msg = response.data; }).catch(function(error){ console.log(error); }) } } }); </script> </body> </html>
GET请求
语法规则:axios.get(url[,options]);
传参方式:
(1)通过url传参axios(‘url?key=value&key1=val2’).then();
(2)通过params选项传参 axios(‘url’,{params:{key:value}}).then();
<script> new Vue({ el:"#app", data:{ msg:"msg111" }, methods:{ getMsg:function(){ axios.get("json/data.json") .then(function(response){ var data =eval("(" +response.data +")") document.getElementById("temp").innerHTML=data.msg; }).catch(function(error){ console.log(error) }) } } }); </script>
POST请求
axios.post(url,data,[options]);
axios默认发送数据时,数据格式是Request Payload,并非常用的Form Data格式, 所以参数必须要以键值对形式传递,不能以json形式传。
<script> new Vue({ el:"#app", data:{ msg:"msg111" }, methods:{ getMsg:function(){ axios.post("json/data.json","name=zhangsan") .then(function(response){ console.log(response.data) }).catch(function(error){ console.log(error) }) } } }); </script>
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- Java 多线程(七):线程池
- Java 多线程(五):锁(三)
- Java 多线程(四):锁(二)
- Java 多线程(三):锁(一)
- Java 多线程(二):并发编程的三大特性
- Java 多线程(一):基础
- Java SE 18 新增特性
- Java SE 17 新增特性
- Java SE 16 新增特性
- Java SE 15 新增特性
- Java SE 14 新增特性
- Java SE 10 Application Class-Data Sharing 示例
- Java SE 13 新增特性
- Java SE 12 新增特性
- Java SE 11 新增特性
- Java SE 10 新增特性
- Java SE 9 模块化示例
- Java SE 9 多版本兼容 JAR 包示例
- Java SE 9 新增特性
- Java SE 8 新增特性