# 小知识1
## vue和jquery的区别
- 赋值
> jquery
```html
<input id="test" type="text"/>
```
```javascript
//获取dom
var dom = document .getElementById('test);
//取值
console.log(dom.val());
//赋值
dom.val('这里赋值');
~~输入框输入值后,取值赋值都是手动操作,手动赋值后需要手动更新视图(输入框才会更新)
```
> vue
```html
<input v-model="test" type="text"/>
```
```javascript
//取值
console.log(this.text);
//赋值
this.text = '这里赋值';
```
~~输入框输入值后,自动赋值变量,手动赋值的时候也会改变视图
*****
- 循环
> jquery
```html
<div id="test"></div>
```
```javascript
//获取dom
var dom = document .getElementById('test);
var list=[{
label:'测试',
value:1
}]
var str = '';
for(var i =0;i<list.length;i++){
str = '<span id="+list[i].value+">+list[i].label+'</span>'
}
dom.innerHtml(str);
~~list值改变每次更新视图都需要操作字符串,同时复杂的dom用字符串的形式难以维护
```
> vue
```html
<div>
<span :id="item.value" v-for="item in list">{{item.label}}</span>
</div>
```
```javascript
var list=[{
label:'测试',
value:1
}]
```
~~直接在dom上自动绑定,复杂dom也好维护,同时list数据改变,自动更新视图
- vue和react以及angular的区别
> 流行的三个框架思想都是一至,在写法,调用,以及性能上可能有着不同的差别
1. angular -> react - > vue
2. vue,react -> angular
3. react -> vue
~~ angular - > angularjs
*****
## jquery注意
- 循环拼接字符串
```javascript
var str = '';
for(var i =0;i<list.length;i++){
str = '<span id="'+list[i].value+'">'+list[i].label+'</span>'
}
dom.innerHtml(str);
```
这样子层次复杂很难维护,可以 采用如下写法
```html
<div id="test"></div>
<script id="temp">
<span>姓名:${label}</span>
<span>名称:${value}</span>
</script>
```
``` javascript
var temp = document .getElementById('temp);
var dom = document .getElementById('test);
var str = temp.innerHtml;
for(var i =0;i<list.length;i++){
var ele = list[i];
str = str.replace('${label}',ele.label);
str = str.replace('${value}',ele.value);
}
dom.innerHtml(str);
```
~~ 这样子好处是不用拼接字符串 ,以类模版的形式
- 单引号和双引号
> 页面中单引号和双引号都是生效的,es6最新规定字符串全部用单引号,标签属性用双引号
```javascript
//单引号
'<span id="'+list[i].value+'">'+list[i].label+'</span>'
//双引号,这里的属性双引号需要转义
"<span id=\""+list[i].value+"\">"+list[i].label+'</span>'
```
- 回调地狱——ajax
深层次的代码嵌套,代码难以维护,以函数的方式分割
```javascript
//回调嵌套
//处理逻辑1
$.ajax(...,function(res){
var list =res;
...
//处理逻辑2
$.ajax(...,function(res){
var list =res;
...
//处理逻辑3
$.ajax(...,function(res){
var list =res;
...
})
})
})
```
```javascript
//链式调用
//处理逻辑1
function test1(params){
return new Promise(function(resolve,reject){
$.ajax(...,function(res){
var list =res;
resolve(rest)
})
})
}
//处理逻辑2
function test2(params){
return new Promise(function(resolve,reject){
$.ajax(...,function(res){
var list =res;
resolve(rest)
})
})
}
//处理逻辑3
function test3(){
return new Promise(function(resolve,reject){
$.ajax(...,function(res){
var list =res;
resolve(rest)
})
})
}
test1().then(function(res){
...
return test2(res);
}).then(function(res){
...
return test3(res);
})).then(function(res){
...
})
```
- 字符串凭借处理逻辑
在拼接的字符串中串逻辑
```javascript
//正常写法
label = list[i].label;
label = label +'/test';
value = list[i].value;
value = value +'/test';
'<span id="'+value+'">'+label+'</span>'
//巧用数组写法
function value(list){
value = list[i].value;
value = value +'/test';
}
var list = [
'<span id="',
(function(){
label = list[i].label;
label = label +'/test';
return label;
})(),
'">',
value(list),
'</span>'
]
console.log(list.jion(''));
~~ layui框架中大量拼接字符串都是使用该方法
~~ split 和join(字符串拼接常用的方法)
```
- js和jquery尽量不要混合何用
jquery是js的增强包有着满足大量需求api包,不要忽略jquey的包手动去写,
这样子让代码不易维护,如果找不到合适api,自己造api;
```javascript
//普通写法
for(var i =0;i<list.length;i++){
var ele = list[i];
console.log(ele,i);
}
//jquery写法
$.each(list,function(index,ele){
console.log(ele,index);
});
```
自己造api也就是自己封装工具包,例如加水印,图片压缩,日期格式化等,也可以直接使用别人的工具包,不能满足自己需求的,二次开发,封装成自己的包。
开发几年后,就会发现自己攒了很多自己的库(提供开发效率),比较好的库可以开源让更多人参与维护和使用。
- github(全球)
- gitee(国内)
- 例子-水印生成器
[view-source:https://canvas.avue.top/](view-source:https://canvas.avue.top/)
[https://canvas.avue.top/](https://canvas.avue.top/)
*****
## vue注意
- {{}}和v-text区别
如果网速慢的情况下花括号会显示出来,而v-text知道数据出来才会显示
- v-model绑定对象的时候
双向绑定数据的时候一定要在data里面申明,否则无法绑定数据
```html
<input v-model="test" type="text"/>
```
```javascript
data(){
return {
text:'',
}
}
```
~~ 赋值时候视图无更新的情况,可以用this.$set方法强制赋值
~~ 如果绑定对象是深层次的结构对象,没在data里面申明深层次的,而且要在v-model下水用,一定要用this.$set赋值
- vue也内置了dom操作方法
项目中使用vue时,最好不好用jquery包,因为他也内置了dom操作包,如果混合使用由于生命周期的问题会产生很多未知问题
~~给标签加一个ref属性,直接this.$ref.name即可
```html
<div ref="test"></div>
```
```javascript
mounted(){
this.$ref.test.className= '样式名称'
}
```