Vue入门笔记
在html文件里面引入 vue。js,vue-resource。js,插件
把该逻辑写在 car。js 再引入该界面需要的逻辑的js-------------------------最简单的vue实例
$mount()手动挂载
当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中;
假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载。
<div id="app">
{{name}}
</div>
<button onclick="test()">挂载</button>
<script>
var obj= {name: '张三'}
var vm = new Vue({
data: obj、、
})
function test() {
vm.$mount("#app");
}
beforecreated:el
和 data 并未初始化
created:完成了
data 数据的初始化,el没有
beforeMount:完成了
el 和 data 初始化
mounted :完成挂载
beforecreate :
举个栗子:可以在这加个loading事件
created :在这结束loading,还做一些初始化,实现函数自执行 放请求那数据,dom还没渲染,等数据请求过来一起渲染
mounted :
在这发起后端请求,拿回数据,配合路由钩子做一些事情
beforeDestory:
你确认删除XX吗? destoryed :当前组件已被删除,清空相关内容
数据要写在 return 里面而不是像文档那样子写
ps:es6与es5的语法
es5:
export.default={
data:function(){
return:{
greeting:"hello"
}
}
}
es6:
export default{
data(){
return {
greeting:"hello"
}
}
}
箭头方式函数:
()=》{函数体} 0个参数用()
x=》{函数体} 1个参数可以省略()
(x,y)=》{函数体} 多个参数不能省略()
v-model:主要在表单里面实现,文本框,下拉框,多选框,复选框,textarea 双向的功能 文本框输入以后模型也会改变,反之,模型改变, 文本框里面的内容也会改变
v-text:文本的渲染。
v-show:dom存在(跟display:none 一样)元素存在
v-if:也是判断dom是否显示,如果满足条件 显示,否则不显示(但是 不满足条件 dom都没有生成)
v-bind:给dom添加属性,如果动态添加图片的src地址,就要绑定src的属性,给src赋值
v-for:循环,渲染数组
v-on:事件绑定
vue创建出来里面的函数:
new Vue{
data:{//data里面的都是模型
message:"hello vue"
},
filter:{
},
mounted:function(){
},
methods:{
},
}
过滤器 filter:对后台传过来的数据进行业务转换
组件component 实现代码的复用。
@click 给元素绑定事件 所有的事件绑定都写在 methods里面
monuted方法:相当于 document.ready方法,在实例创建完成,dom渲染完成之后需要查询一个接口,ajax写在这里面。为了确保vue实例已经插入文档,需要在写上 Vue.nextTick 这样 this就===vm
比如说一上来就要把 已经渲染的“hello vue”改成vue hello 就要在mounted里面写上方法
var vm=new Vue{
data:{
el:".continer"//控制在哪个范围内
message:"hello vue"
},
filter:{
},
mounted:function(){
this.changeMsg()
},
mounted:function(){
Vue.$nextTick(function(){
vm.changeMsg()
})
},
methods:{
changeMsg:functin(){
this.message="vue hello"
}
},
}
使用 v-for渲染购物车界面
使用到vue-resource访问接口 .then 返回数据 res.body这个是插件封装的
this.$http.get(“datamessage.json”,{"id":"123"}).then(function(res){})
this.$http.jsonp(“datamessage.json”,{"id":"123"}).then(function(res){})//jsonp跨域
在vue实例里面 所有的this都指向vue实例
data:{//data里面的数据 是要放在 html页面里面的 跟小程序 一样
list:{},
money:0
},
mounted:function(){
this.changeMsg()
},
methods:{
changeMsg:functin(){
var _this=this;//为了在xhr内部使用 但是使用es6箭头函数的话 这一步就不用了,因为箭头函数会把this只想最外层
this.$http.get(“datamessage.json”,{"id":"123"}).then(function(res){
_this.list=res.body.result.list//不能直接使用this,因为作用域已经发生改变 list{}里面有值了 就可以v-for渲染到界面了
_this.money=res.body.result.money
})//this代表 vue-resource这个插件已经集成到vue里面了 所以要在 vm这个vue实例里面使用$http这个方法
}
},
<li v-for="item in list"> 如果想要使用索引 <li v-for="(item,index )in list">
<span>{{item.listname+“===”+index}}</span>//每一项list的name
<div v-for="products in item.products" v-text="{{products.partsname}}">//每一项list里面有好多商品的名称 也需要遍历 可以使用v-text 当然也是可以使用
下面{{}}的写法
{{products.partsname}}
</div>
<img src={{item.image}} v-bind:_src={{item.image}} />//不能遍历上去 渲染不出来 必须使用 v-bind 绑定个属性
+ input
- input
个数<input type="text" disabled value="0" v-model="item.number"/ >//v-model双向数据绑定 才可以实时的监控数量
单价 <div>{{item.danjia}}</div>
总金额<div>{{item.danjia*item.number}}</div>
</li>
使用v-on绑定事件 实现动态金额的计算
过滤器的使用
对金额进行¥+两位小数的转换(格式化)额外补充:一般来说小数点都应该有后台传过来的,因为如果前端做js转换的话会有数据的丢失,比如13.278 使用toFixed(2)会转化成13.28 进行四舍五入。
全局过滤器:所有vue的实例,所有的页面都可以使用
局部过滤器:当前实例化的vue可以使用
js里面 添加
filters:{//局部过滤器
filterMoney:function(value){//需要传入一个值
return “¥”+value.toFixed(2)+type//传入的值 return出来
}
}
//全局过滤器 第一个参数是过滤器的名称,第二参数是回调("值",“添加的参数”)也可以只有一个值(”值“)
Vue.filter("filterMoney",function(value,type){
return “¥”+value.toFixed(2)+//传入的值 return出来
})
总金额<div>{{item.danjia*item.number | filterMoney("元")}}</div>
html里面 必须使用 |
单价 <div>{{item.danjia | filterMoney}}</div>
总金额<div>{{item.danjia*item.number | filterMoney}}</div>
通过+ 使得商品的个数增加 从而使得商品的单价 变成相应的 倍数 总金额做相应的变化
html:
- input <input type="text" value="+" v-on:changeMoney(item,-1)>//item传入商品信息,-1或者1传入点击的是+还是-
<input type="text" disabled value="0" v-model="item.number"/ >//只要这里的值发生改变,总金额也会改变,因为是*运算
+ input <input type="text" value="+" @click:changeMoney(item,1)>
methods:{
changeMoney:function(product,way){
if(way>0){
product.number++//双向数据绑定 v-model里面的值
}else{
product.number--;
if(product.number<1){
product.number=1;//数量小于1的时候 不能再减了
}
}
}
}
实现 单选,全选,取消全选的操作
首先 给class添加新的class名称 不能直接在原来的类名后面加上{{}} 要跟src一样 只要涉及到属性,就使用 v-bind 并不会覆盖之前的class名称 绑定class比较特殊,一定是一个object对象
{},或者【】
<div class="class1" v-bind="{‘checked’:'item.checked'}">
<svg></svg>//利用svg实现选择按钮
//如果item。checked==true的
话就添加上checked类,否则不添加。这个案例中 拿到的后台的json字符串里面并没有 checked这个属性 所以可以通过点击方法判断状态往json字符串里面添加checked的参数
@click=selectedProduct(item)>
</div>
methods:{
selectedProduct:function(item){
if(typeOf item.checked=='undefined')//判断checked参数是否存在
Vue.set(item,"checked",true)//如果不存在,可以使用Vue全局设置“checked”参数
this.$set(item,"checked",true)//这是局部设置 使用$
}else{//如果checked参数==true 那就取反 checked==false;
item.checked==!item.checked
}
}
实现全选
全选 不在循环里面
<div class="class2" v-bind="{‘checked’:'checkedAllFlag'}" @click=checkedAll()>//如果没有参数加不加()都可以
<svg></svg>//利用svg实现选择按钮
<span>全选</span>
</div>
可以在data:{
list:{},
checkedAllFlag:false,//因为不在循环中 在循环中拿不到item 所不能在data里面声明
}
methods:{
checkedAll:function(){
this.checkedAllFlag=!this.checkedAllFlag//点击一次就进行取反了
var _this=this
this.list.forEach(item,index){//遍历商品列表
if(typeOf item.checked=='undefined'){//如果一上来就选择全选,单项选中还没有往json字符串里面 添加checked参数,所以还是要判断,json字符串里面是否有checked参数
_this.$set(item,"checked",_this.checkedAllFlag)//true
}else{
item.checked==!_this.checkedAllFlag//false
}
}
}
}
取消全选:
//<div class="class2" @click='this.checkedAllFlag=false'>//可以直接写表达式, 一元表达式或者三元表达式 不可以写逻辑和声明变量
取消全选
</div>
单项选择的选中标识也要去掉
//<div class="class2" @click='checkedAll(false)'>//要在函数里面加上参数 告诉是全选 还是取消全选
取消全选
</div>
<div class="class2" v-bind="{‘checked’:'checkedAllFlag'}" @click=checkedAll(true)>//如果没有参数加不加()都可以
<svg></svg>//利用svg实现选择按钮
<span>全选</span>
</div>
具体实现自己写逻辑
methods:{
checkedAll:function(flag){
this.checkedAllFlag=flag//全选的时候 是true 取消全选的是 false
var _this=this
this.list.forEach(item,index){//遍历商品列表
if(typeOf item.checked=='undefined'){//如果一上来就选择全选,单项选中还没有往json字符串里面 添加checked参数,所以还是要判断,json字符串里面是否有checked参数
_this.$set(item,"checked",_this.checkedAllFlag)//true
}else{
item.checked==_this.checkedAllFlag//false
}
}
}
}
商品总金额发生改变
data:{
titloPrice:0
}
methods:{
selectedProduct:function(item){
if(typeOf item.checked=='undefined')//判断checked参数是否存在
Vue.set(item,"checked",true)//如果不存在,可以使用Vue全局设置“checked”参数
this.$set(item,"checked",true)//这是局部设置 使用$
}else{//如果checked参数==true 那就取反 checked==false;
item.checked==!item.checked
}
this.titloPriceAll()//单选的时候调用计算总金额的方法 全选的时候也要调用 这里就不写了
}
titloPriceAll:function(){
var _this=this;
this.titloPrice=0
this.list.forEach(item,index){
if(item.checked){
_this.titloPrice+=item.danjia*item.number
}
}
}
}
删除
点击删除的icon会有个弹框和遮罩 yes、no 根据class雷名来判断 v-bind:class="{itemShow:showflag}" @click=‘delConfirm(item)’
在data里面
showflag=false;
currentProduct=[];//存储当前的item的
delConfirm:function(item){//传入item告诉是删除哪一项
this.showflag=true;
this.currentProduct=item;
}
遮罩根据 v-if=“showflag==true”来判断
在“yes”的按钮里面生明函数 delProdect()
delProdect:function(){
var index=this.list.indexOf(this.currentProduct)//在items循环列表里面找到当前item的当前索引
this.list.splice(index,1)//从items里面删除掉当前item 这样就不会在页面上渲染出来了,
splice代表 从当前所以开始删除1个
其实这个删除 应改掉后台接口的,把item的id 传给后台让他们删除 ,删除成功返回一个字段,告诉我们已经删除成功,再进行渲染
this.$http.get()
this.showflag=false;
}
点击no和×会消失,@click=“showflag=false”点击yes会执行相应的操作,
地址栏的选配,默认显示三条收件人地址的卡片 点击“更多” 渲染出来全部的收货人地址信息的卡片。
1,渲染全部的收货人信息 卡片全部显示出来
2,只显示三条数据 点击“more”查看全部数据
使用过滤函数
、、
computed:{//实时计算函数 可以直接在html文件里面写,相当于 data里面的对象,可以直接在html里面写,object型,这样才可以 return
}
截取0-3条数据 computed里面 的filterAddress会返回一个全新的数组。
点击“更多”改变 limitNum的值 为数组的长度
可以直接在click里面写 一元表达式 但是不要出现this(在指令里面一律不能使用this) 所以上面会没效果 改为 limitNum=addressList.length
点击哪一个卡片哪一个卡片有被选中的效果
实现如下 : 在data里面定义一个currentIndex:0,代表选中的索引,判断选中的索引跟数组的索引是否一致,如果一致那就添加 被选中状态的类名
设置默认和默认地址 这是互斥(使用v-if)的两个选项
卡片选好后 选择配送方式 默认为“标准配送”
以上是 Vue入门笔记 的全部内容, 来源链接: utcz.com/z/378167.html