vue.js
1.1 mvvm的分层思想
var vm = new Vue({
el:'#app',
data:{
msg:'这是个消息!',
intervalId:null,//在data上定义一个定时器,
}
})
1.2 v-block 能解决插值表达式在网速慢的时候,页面渲染的时候的闪烁问题.
用法:
<style>
[v-block]{
display:none;
}
</style>
<p v-block> 这里的内容不会被覆盖</p>
<h4 v-text='msg2'>这里的内容会被覆盖</h4> 默认v-text是没有闪烁问题的.
<h4 v-html='msg3'>这里如果写内容,也会被覆盖.</h4>
1.3 对于ES6中的this指向问题:
一般写法:
methods:{
lang(){
let _this = this
setInterval(function () {
console.log('打印日志...',_this.msg3);
},400)
}
}
ES6中的箭头函数写法:
methods:{
lang(){
this.intervalId = setInterval(() => {
console.log('打印日志...',this.msg);
// 这个内部的this 就指向外部的this,箭头函数内部的this 始终和外部的this保持一致.
},400)
},
stop(){
clearInterval(this.intervalId);
}
}
1.4 事件修饰符
<div @click='handleDiv'>
<button @click.stop='handleClick'></button> // .stop阻止这个事件向外冒泡,这个是从里到外的事件.
</div>
<div @click.capture='handleDiv'>
<button @click='handleClick'></button> // .capture捕获里面的这个按钮的事件,这个是从外到里的事件
</div>
<div @click.self='handleDiv'>
<button @click='handleClick'></button> // .self只有点击自己才会出发的事件
</div>
.stop和.self的区别:
.stop会阻止从本身开始,一直向外冒泡的事件,但是.self只会阻止本身事件,不会自身以外的事件.
//使用.prevent阻止默认行为
<a @click.prevent='handleLink'>点击去百度</a>
//使用.once只触发一次事件处理函数,会阻止一次默认行为,第二次就是回复原样,这两个事件之间,没有联系.
<a @click.prevent.once='handleLink'>点击去百度查询</a> **对于 eval()方法,将字符串解析成表达式**
var codeStr = 'parseInt(this.val1)' + this.pot + 'parseInt(this.val2)'
this.result = eval(codeStr);
简单的计算器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="n1">
<select v-model="opt">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" v-model="n2">
<input type="button" value="=" @click="calc">
<input type="text" v-model="result">
</div>
<script>
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
n1: 0,
n2: 0,
result: 0,
opt: '+'
},
methods: {
calc() { // 计算器算数的方法
// 逻辑:
/* switch (this.opt) {
case '+':
this.result = parseInt(this.n1) + parseInt(this.n2)
break;
case '-':
this.result = parseInt(this.n1) - parseInt(this.n2)
break;
case '*':
this.result = parseInt(this.n1) * parseInt(this.n2)
break;
case '/':
this.result = parseInt(this.n1) / parseInt(this.n2)
break;
} */
// 注意:这是投机取巧的方式,正式开发中,尽量少用
var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)'
this.result = eval(codeStr)
}
}
});
</script>
</body>
</html>
通过设置绑定class 样式
在数组中使用三元表达式:
<h1 :class="['thin', 'italic', flag?'active':'']">这是一个很大很大的H1</h1>
也可以传入一个对象,在数组中使用 对象来代替三元表达式,提高代码的可读性
<h1 :class="['thin', 'italic', {'active':flag} ]">这是一个很大很大的H1</h1>
通过设置绑定style 样式
<h1 :style="[ styleObj1, styleObj2 ]">这是一个h1</h1>
<script>
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
styleObj1: { color: 'red', 'font-weight': 200 },
styleObj2: { 'font-style': 'italic' }
},
methods: {}
});
</script>
v-for 循环对象
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
user: {
id: 1,
name: '张三',
gender: '男'
}
},
methods: {}
}); <b>注意:</b><i>在遍历对象身上的键值对的时候,除了有value key,在第三个位置还有一个索引 </i>
<p v-for="(val, key, i) in user">值是: --- 键是: -- 索引: </p>
注意:如果使用 v-for 迭代数字的话,前面的 count 值从 1 开始
<p v-for="count in 10">这是第 8 次循环</p>
<font color=red size=72> </font>
v-for 中的 key
---
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
id: '',
name: '',
list: [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' },
{ id: 3, name: '王五' },
{ id: 4, name: '翟柳' },
{ id: 5, name: '邰南奇' }
]
},
methods: {
add() { // 添加方法
this.list.unshift({ id: this.id, name: this.name })
}
}
});
v-if 的特点:每次都会重新删除或创建元素, v-if 有较高的切换性能消耗; v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式,v-show 有较高的初始渲染消耗; 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show; 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if.
2019年1月1日10:46:45
1.1 一些小方法
- 在数组中的 some() 方法中,如果返回 true ,那么,这个方法会立即终止这数组的后续循环.
- 也可以用
let index = this.array.findIndex(item => { if(item.it == id){ return true; } })
来找到数组中的索引. - 在指令 v-for中 , 除了可以循环数组,还可以循环方法的返回值,指令可以拿到vue实例对象data中所有的数据.
-
之前, v-for 中的数据,都是直接从 data 上的list中直接渲染过来的,现在, 我们自定义了一个 search 方法,同时,把 所有的关键字,通过传参的形式,传递给了 search 方法,在 search 方法内部,通过 执行 for 循环, 把所有符合 搜索关键字的数据,保存到 一个新数组中,返回
<tr v-for="item in search(keywords)" :key="item.id"> <td></td> <td v-text="item.name"></td> <td></td> <td> <a href="" @click.prevent="del(item.id)">删除</a> </td> </tr>
-
jQuery中有个contains 选择器,选择内容中所有包含 “is” 的
<p>
元素$(“p:contains(is)”);$(“:contains(text)”)选择内容中所有包含 “text” 的元素 - ES6中,为字符串提供了一个新方法,叫做 String.prototype.includes(‘要包含的字符串’) // 如果包含,则返回 true ,否则返回 false.
过滤器
-全局过滤器,
-私有过滤器.
-思考:函数中,形参的默认值是怎么样设置的??
-padStart ES6中的,新语法.为字符串添加补充数字.常用在时间的格式.
-@keyup.enter=’add()’ ,键盘抬起事件.
-自定义全局按键修饰符 Vue.config.keyCodes.f2 = 113
-自定义全局指令 Vue.directive(‘focus’) // 例如:v-color=”‘red’”;
2019年1月6日17:47:03
vuex注意细节
.vue文件中
`<button @click="redPrice(3)">点击降价</button>`
methods: {
// redPrice(amount) {
// // 这种方式是绕过mutations直接操作state中的数据 ,在严格模式下会报错的
// // this.$store.state.products.forEach(it => {
// // it.price -= 1;
// // });
// // this.$store.commit("redPrice"); // 通过mutations取操作数据
// this.$store.dispatch("dispatchPrice", amount); // 这个 dispatchPrice 就是vuex 中的 actions对象中的那个方法
// },
...mapActions(["redPrice"])
},
computed: {
products() {
return this.$store.state.products;
},
...mapGetters(["saePrice"])
},
在store.js中:
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export const store = new Vuex.Store({
// strict: true,
state: {
// 存储数据
products: [
{ name: "马云", price: 100 },
{ name: "马化腾", price: 90 },
{ name: "马冬梅", price: 10 },
{ name: "马蓉", price: 1 }
]
},
mutations: {
redPrice(state,payload) { // 最多支持传递2个参数,第一个参数是 state 第二个参数可以是一个对象,里面封装多个数据.
state.products.forEach(it => {
it.price -= payload;
});
}
}, // 类似处理事件的方法,当触发事件改变这个值的时候,就可以用这个
actions: { // 处理异步分发的方法
redPrice(context,payload) {
// 这个context 类似 this.$store
setTimeout(function() {
context.commit("redPrice",payload); // 分发需要异步处理 的函数 就是上面mutations中的
}, 2000);
}
},
getters: {
// 获取数据 修改数据
saePrice(state) {
let arr = state.products.map(it => {
return {
name: it.name + "xxx",
price: "%" + it.price / 2
};
});
return arr;
}
}
});