Bootstrap

Vue基础

html 超文本标记语言(HyperText Mark-up Language)

html元素:块元素标签(行元素)和内联元素标签(行内元素)

块元素独占一行,块元素之后需要换行;

例如:标题标签,段落标签,通用块容器标签。

内联元素可以排列在一行,设置宽高无效,快高由内容撑开(特殊除外)。

例如:超链接标签,图片标签(支持宽高)

html注释css注释:/* */ js注释://

css引入方式:内联式(行内样式)、嵌入式(头标签中)、外链式

css选择器:标签选择器、类选择器、id选择器、伪类选择器、层级选择器(可理解为选择器嵌套,例(.con li{}))

css属性:

布局常用

width:宽    height:高    background:背景颜色   border:边框
border-left:左边框。。。    margin:外边距(margin-left等)
float:浮动(左(float:left)、右浮动)

文本属性

color:颜色    font-size:大小   font-family:字体    font-weight:设置文字加粗(bold),不加粗(normal)
line-height:行高  text-decoration:下划线(none无)

路径

绝对路径:相对于磁盘的位置去定位文件的地址
相对路径:相对于引用文件本身去定位被引用的文件地址
./表示当前路径下,../表示上一级路径

表单

form:表单标签  action:数据提交地址  method:提交方式(post、get)
<label> 表单定义文字标注   <input>  定义通用表单元素
type属性:text:文本行   placeholder:文本行默认提示文字    password:密码框   radio:单选框
checkbox:复选框   file:上传文件  submit:提交  reset:重置  button:普通按钮
value:定义表单元素的值  name:定义表单元素的名称,此名称是提交数据时的键名
<textarea>:文本域   <select>:下拉框,与<option>(选项)连用

表格

表格:<table>:表格标签   <tr>行标签   <td>:单元格   colspan:水平合并单元格  rowspan:垂直合并单元格
border-collapse:表格边线合并(collapse)

JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定。

定义变量需要用关键字 ‘var’:var iNum = 10;

变量类型:number:数字 string:字符串 boolean:布尔true或false

undefined:undefined类型,变量声明未初始化(未定义),它的值就是undefined

null:null类型,表示空对象,如果定义的变量将来准备保存对象,可以将变量初始化为null,在页面上获取不到对象,返回的值就是null

变量,函数,属性命名规范
1、区分大小写
2、第一个字符必须是字母、下划线(_)或者美元符号($)
3、其他字符可以是字母、下划线、美元符或数字
且遵守匈牙利命名风格
o:Object(对象);a:Array(数组); s:String; 
i:Integer(整形);b:boolean(布尔); f:float;fn:function(函数);

定义一个新变量在其名字前加类型缩。
比如iNun : 10;(数字,首字母缩写为i)
函数:跟python中类似,可传参(不传参),可匿名,可有返回值(return,结束函数)

封闭函数:是javascript中匿名函数的另外一种写法,创建一个一开始就执行而不用命名的函数。

作用:可以创造一个独立的空间,在封闭函数内定义的变量和函数不会影响外部同名的函数和变量,可以避免命名冲突,在页面上引入多个js文件时,用这种方式添加js文件比较安全

条件语句

条件运算符(数字可等于对应的字符串)、=(值相等)、>、>=、<、<=、!=、&&(而且)、||(或者)、!(否)

if 、else:

if …

else if …

else…

获取元素的方法:使用内置对象document上的getElementById方法来获取页面上设置了id属性的元素,获取到的是一个html对象,然后将它赋值给一个变量; 例如:

<script>	
	var oDiv = document.getElementById('div1(类选择器)');
</script>
......
<div id = 'div1'>这是要获取的元素</div>

由于代码自上而下运行,执行oDiv时还没加载div1,解决办法有两个:

1.将代码写到div下面
2.将js语句放到window.onload(延迟加载,先加载别的地方,最后加载此处)触发的函数里
<script type="text/javascript">
    window.onload = function(){
        var oDiv = document.getElementById('div1');
    }
</script>

操作元素属性:获取的页面元素,就可以对页面元素的属性进行操作,属性的操作包括属性的读和写。

var 变量 = 元素.属性名 (读取属性

元素.属性名 = 新属性值 (改写属性

innerHTML:读取或者写入标签包裹的内容

属性名在js中的写法
1、html的属性和js里面属性写法一样
2、“class” 属性写成 “className”
3、“style” 属性里面的属性,有横杠的改成驼峰式,比如:“font-size”,改成”style.fontSize”
事件属性及 匿名函数
事件属性
鼠标点击事件属性(onclick)
鼠标移入事件属性(mouseover)
鼠标移出事件属性(mouseout)

将函数名称赋值给元素事件属性,可以将事件和函数关联起来

数组及操作方法
定义数组的方法:
方法一:var aList(名称) = new Array(1,2,3);
方法二:var aList(名称) = [1,2,3,'asd'];
数组操作方法:
获取长度:aList.length
下标:aList[0]  第一个数
join()将数组拼接为字符串
push():从数组最后增加成员
pop():从数组最后删除称成员
reverse():将数组反转
indexOf():返回数组中元素第一次出现的索引值(下标)
splice():在数组中增加或删成员

例如:

var aList = [1,2,3,4];

aList.splice(2,1,7,8,9);  //(从第二个元素开始,删除1个元素,然后在此增加7,8,9三个元素)
aList.splice(2,1);   // (从第二个开始,删除一个元素)
aList.splice(2,0,7,8,9);  //(从第二个开始,删除0个元素,在此添加7,8,9三个元素)
多维数组:指数组的成员也是数组(嵌套数组)

例如:var aList = [[1,2,3],['a','b']]

数组去重
var aList = [1,2,3,4,4,3,2,1,2,3,4,5,6,5,5,3,3,4,2,1];
var aList2 = [];
for(var i=0;i<aList.length;i++){
    if(aList.indexOf(aList[i])==i){
        aList2.push(aList[i]);
    }
};
alert(aList2);

字符串处理方法

+(与pyhton类似)                           parselnt() 将字符串转化成整数
parseFloat()将数字字符串转化为小数        split()把字符串分割成数组
indexOf()查找字符串是否含有某字符(若有重复,则只找第一个下标)
substring()截取字符串,substring(1,3)截取下标从1开始到3的字符串,不包括3;
substring(1)截取从第1个开始到最后

字符串反转:str.split('').reverse().join('');
定时器
setTimeout(只执行一次的定时器),setInterval(反复执行的定时器)
clearTimeout(关闭执行一次的定时器),clearInterval(关闭重复执行的定时器)
变量作用域

全局变量:在函数之外定义的变量,为整个页面公用,函数内部外部都可以访问。

局部变量:在函数内部定义的变量,只能在定义该变量的函数内部访问,外部无法访问。

Vue:前端三大框架(Angular.js,React.js,Vue.js)之一

Vue.js可以作为一个js库来使用

Vue的核心库只关注视图层

Vue也可以将界面拆分成一个个的组件,通过组件来构建界面,然后用自动化工具来生成单页面系统

el:挂载标签
data:存放定义的变量
methods:存放定义的函数
computed:存放计算属性(计算属性和方法的区别是计算属性依赖于缓存,除非缓存对象发生改变,否则不会重新加载,而方法在每次页面渲染时都会重新调用)
watch:存放的是侦听对象(以data中对象创建的函数,两个参数,第一个是变化过后的值,第二个是变化之前的)

Vue实例:每个 Vue 应用都是通过实例化一个新的 Vue对象开始的

window.onload(延迟加载,先加载其他,最后加载此处) = function(){
	var vm = new Vue({
		el:'#app',
		data:{message:'hello world!'}
	});
}   

<div id="app">{{ message }}</div>

模板语法:插入值(Mustache(胡子) 语法 --> {{ }} )

指令:是带有“v-”前缀的特殊属性。指令属性的值预期是单个JavaScript表达式,指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM。

常见的指令及缩写:**v-bind(:)**绑定,用于网址等 ;**v-on(@)**点击事件

如果是标签的属性要使用值,就不能使用“Mustache”语法,需要写成使用v-bind指令:

计算属性:带有复杂逻辑的表达式,我们可以使用计算属性

侦听属性:侦听属性的作用是侦听某属性值的变化,从而做相应的操作,侦听属性是一个对象,它的键是要监听的对象或者变量,一般是函数,当你侦听的元素发生变化时,需要执行的函数,这个函数有两个形参,第一个是变化后的值,第二个是当前值。

绑定:使用v-bind指令来设置元素的class属性或者sytle属性,它们的属性值可以是表达式,vue.js在这一块做了增强,表达式结果除了是字符串之外,还可以是对象或者数组。

数据绑定

class绑定:可以给v-bind:class传一个对象,以动态的切换class

数组绑定<div v-bind:class="[activeClass, errorClass]"></div>

如果你也想根据条件切换列表中的 class,可以用三元表达式:

<div v-bind:class="[isActive ? activeClass : 'not active'(若isActive为真,则显示activeclass,否则显示not active), errorClass]"></div>

当条件多时这样写繁琐,数组语法中可以用对象语法:<div v-bind:class="[{ active: isActive }, errorClass]"></div>

对象绑定<div class="static" v-bind:class="{active:isActive,'text-danger':hasError(true则显示或false则不显示) }"></div>

style绑定:style 的对象语法十分直观——看着非常像 CSS,但其实是一个JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 来命名

<div v-bind:style="{color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
  activeColor: 'red',
  fontSize: 30
}

绑定对象

<div v-bind:style="styleObject"></div>
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}

数组语法

<div v-bind:style="[baseStyles, overridingStyles]"></div>
data: {
  baseStyles: {
    color: 'red',
  },
  overridingStyles{
  	Background:blue
  }
}

条件渲染

v-if可以控制元素的创建或者销毁<div v-if="type === 'A'">A</div>

v-else-if,顾名思义,充当 v-if 的“else-if 块”,可以连续使用<div v-else-if="type === 'B'">B</div>

v-else指令来表示 v-if 的“else 块”,v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别<div v-else>Not A/B</div>

v-show:另一个用于根据条件展示元素的选项是 v-show 指令。用法和v-if大致一样,但是它不支持v-else

它和v-if的区别是,它制作元素样式的显示和隐藏,元素一直是存在的<h1 v-show="ok">Hello!</h1>

列表渲染:遍历v-for

遍历数组<li v-for="(item,index) in items"> {{ item }} </li> (items为数组,遍历时元素在前,下标在后(可只取一个))–>[1,2,3]

遍历对象<li v-for="(value,key) in object">{{key}} - {{value}} </li>(object为对象,遍历时值在前,键在后(可只取一个))–> {name:‘zs’,age:18}

事件处理:可以用 v-on (@)指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码,事件的处理,简单的逻辑可以写在指令中,复杂的需要在vue对象的methods属性中指定处理函数。

 <input type="button" value="计数+1" v-on:click="count(变量) += 1">@click="count(变量) += 1"
 <input type="button" value="计数+1" v-on:click="fnAdd(函数)">@click="fnAdd(函数)"  在函数中调用变量,需要写this.变量名
<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
表单绑定

v-model 指令在表单 <input><textarea> 元素上创建双向数据绑定(相互影响)

单行文本框

<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>

多行文本框

<span>Multiline message is:</span>
 <p>{{ message }}</p>
 <textarea v-model="message" placeholder="add multiple lines"></textarea>

复选框

单个复选框,绑定到布尔值:

<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>

多个复选框,绑定到同一个数组:

<div id='example-3'>
  <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
  <label for="jack">Jack</label>
  <input type="checkbox" id="john" value="John" v-model="checkedNames">
  <label for="john">John</label>
  <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
  <label for="mike">Mike</label>
  <br>
  <span>Checked names: {{ checkedNames }}</span>
</div>
		......
new Vue({
  el: '#example-3',
  data: {
    checkedNames: []
  }
})

单选框

<div id="example-4">
  <input type="radio" id="one" value="One" v-model="picked">
  <label for="one">One</label>
  <br>
  <input type="radio" id="two" value="Two" v-model="picked">
  <label for="two">Two</label>
  <br>
  <span>Picked: {{ picked }}</span>
</div>
		......
new Vue({
  el: '#example-4',
  data: {
    picked: ''
  }
})

下拉框

<div id="example-5">
  <select v-model="selected">
    <option disabled value="">请选择</option>
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>
......
new Vue({
  el: '...',
  data: {
    selected:''
  }
})
过滤器

过滤器:Vue.js允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和v-bind 表达式

<!-- 在双花括号中 -->
{{ prize | RMB }}
<!-- 在v-bind中 -->
<div v-bind:id="rawId | formatId"></div>

定义过滤器的两种形式:在组件内部定义,在创建Vue之前定义全局过滤器

内部:filters:与methods一样,都属于Vue实例对象内部的方法
filters:{
  RMB:function(value){
    if(value=='')
    {
      return;
    }
    return '¥ '+value;
  }
}
全局:在var vm = new Vue之上
Vue.filter('Yuan',function(value){
  if(value=='')
  {
    return;
  }
  return value+'元';
});
自定义指令

自定义指令:指令是用来做dom操作的,如果vue现有的指令不能满足开发要求,我们需要对普通DOM元素进行底层操作,这时候就会用到自定义指令。

定义一个全局指令,让input框自动获取焦点
Vue.directive('focus',{
  inserted:function(el,binding){
    el.focus();
    el.style.background = 'gold';
    console.log(binding.name);
  }     
})
......
<div id="app">    
  <input type="text" v-focus>
</div>
如果定义成vue对象局部的,可以用vue对象的directives属性:
directives: {
  focus: {
    inserted: function (el,binding) {
      el.focus();
      el.style.background = 'gold';
      console.log(binding.name);
    }
  }
}
实例生命周期
beforeCreate:创建Vue实例化对象前
created:创建对象后
beforeMount:挂在标签前
Mounted:挂在标签后
beforeUpdate:修改数据前
Updated:修改数据后
数据交互

数据交互:vue.js没有集成ajax功能,要使用ajax功能,可以使用vue官方推荐的axios.js库来做ajax的交互。axios库的下载地址:https://github.com/axios/axios/releases

axios完整写法
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

执行get请求:
// 为给定 ID 的 user 创建请求
// then是请求成功时的响应,catch是请求失败时的响应
axios.get('/user?ID=12345')
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});
// 可选地,上面的请求可以这样做
axios.get('/user', {
  params: {
    ID: 12345
  }
})
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});

执行post请求:
axios.post('/user', {
  firstName: 'Fred',
  lastName: 'Flintstone'
})
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});

Vue组件

组件(Component)是Vue.js最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。

所有的 Vue 组件同时也都是 Vue 的实例,所以可接受相同的选项对象(除了一些根级特有的选项) 并提供相同的生命周期钩子。

注册及使用组件
// 注册一个组件:
Vue.component('my-component', {
  template: '<div>A custom component!</div>'
})
//使用组件
<div id="example">
  <my-component></my-component>
</div>
......
new Vue({
  el: '#example'
})


data必须是一个函数,定义的值要写在return{}中!
  data: function () {
        return {
        counter: 0
      }
      

props传递参数:如果想给组件中传递参数,组件要显式地用 props 选项声明它预期的数据
<div id="app">
  <my-component msg01="hello!" :msg02="iNum01"></my-component>    
</div>
			......
Vue.component('my-component',{
  props:['msg01','msg02'],
  template:'<div><p>{{msg01}}</p><p>{{msg02}}</p></div>'
});
var vm = new Vue({
  el:'#app',
  data:{        
    iNum01:12
  } 
})
ES6语法

1.变量声明用let,const

2.箭头函数:可以把箭头函数理解成匿名函数的第二种写法,箭头函数的作用是可以在对象中绑定this,解决了JavaScript中this指定混乱的问题。

var fnRs = (a,b)=>{ }  有参数
var fnRs2 = a =>{ }   一个参数可以不写括号
Var   fnRs3  = ()  =>  { }     无参数时要写括号

3.模块导入import,导出export

// model.js文件中导出
var person = {name:'tom',age:18}
export default {person}
// index.js文件夹中导入
import person from 'js/model.js'
// index.js中使用模块
person.name
person.age
/*
上面导出时使用了default关键字,如果不使用这个关键字,导入时需要加大括号:
import {person} from 'js/model.js'
*/
4.对象的简写
let name = '李思';
let age = 18;
/*
var person = {
    name:name,
    age:age,
    showname:function(){
        alert(this.name);
    },
    showage:function(){
        alert(this.age);
    }
}
*/
// 简写成下面的形式
var person = {
    name,
    age,
    showname(){
      alert(this.name);
    },
    showage(){
      alert(this.age);
    }
}
person.showname();
person.showage();
npm操作
1、打开终端
2、常用终端命令
    // 查看文件夹内容
    dir +回车
    // 进入某个文件夹
    cd 文件夹名 +回车
    // 进入上一级文件夹
    cd .. +回车 
    // 切换到e盘
    e: +回车
    // 清除屏幕
    cls +回车
安装vue得到自动化工具包
// 全局安装 vue-cli
npm install --global vue-cli
// 创建一个基于 webpack 模板的新项目
$ vue init webpack my-project
// 启动开发服务器 ctrl+c 停止服务
cd my-project
npm run dev  启动服务
// 打包上线文件
npm run build
    流程:        
        1.停止服务 ctrl+c
        2.打包:npm run build
        3.在服务目录下找到dist文件夹,拷贝数据到提供数据服务的静态目录文件夹中(static),若此文件夹存在数据,则需清空数据后拷贝
三元表达式
<div v-bind:class = '{active:isActive,bold:isBold}'>出师一表真明世,千载谁堪伯仲间</div>
<div :class = "['active','bold']">出师一表真明世,千载谁堪伯仲间</div>
<div :class = "['active',isBold?'bold':'not bold']">出师一表真明世,千载谁堪伯仲间</div>
</div>
<script>
    var vm = new Vue({
        el:'#app',
        data:{
            isActive:true,
            isBold:false,
        }
    })
</script>
;