Vue总结css
vue引入与导出html
引入一个js文件,若是js文件中有 export default xxx 的内容 就这样引入: import 名称 from '路径' 若是js文件中没有 export default xxx 内容 须要这样引入: import '路径' (此时window增长一个全局变量 initGeetest) 只有在index.html和main.js引入才是全局引入
vue第一天前端
vuevue
Vue是一个优秀的前端框架 开发者按照Vue的规范进行开发 Vue能作什么? 1. 和DOM解耦 与DOM关系很少 2. 适应当前SPA的项目开发 single page application 单一页面应用 3.掌握Vue的开发语法 至关于掌握了新的开发模式,能够适应目前绝大多数的技术环境 特色: 1. 数据驱动视图 可让咱们只关注数据 2. MVVM 双向绑定 3. 经过指令加强了html功能 新特性 4. 组件化 复用代码
实例选项-elnode
- 做用:当前Vue实例所管理的html视图 - 值:一般是id选择器(或者是一个 HTMLElement 实例) - 不要让el所管理的视图是html或者body!
实例选项-dataios
- Vue 实例的数据对象,是响应式数据(数据驱动视图) 数据变化 => 视图变化 - 能够经过 vm.$data 访问原始数据对象 - Vue 实例也代理了 data 对象上全部的属性,所以访问 vm.a 等于 vm.$data.a - 视图中绑定的数据必须显式的初始化到 data 中 ,显示到视图中的数据在data中必须定义 - 数据对象的更新方式 直接 采用 实例.属性 = 值 vm.name = "张三"
实例选项-methodsvue-router
- methods是一个对象 - 能够直接经过 VM 实例访问这些方法,或者在指令表达式中使用。 - 方法中的 this 自动绑定为 Vue 实例。 - methods中全部的方法 一样也被代理到了 Vue实例对象上,均可经过this访问, vm.fn() - 注意,不该该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。理由是箭头函数绑定了父级做用域的上下文,因此 this 将不会按照指望指向 Vue 实例,this.a 将是 undefined
插值表达式(重要)express
做用:会将绑定的数据实时的显示出来:npm
形式: 经过 {{ 插值表达式 }}包裹的形式编程
经过任何方式修改所绑定的数据,所显示的数据都会被实时替换(响应式数据)
a , a = 10 , a == 10 , a > 10, a + b + c "1" + "2" + "3", a.length.split(''), a > 0 ? "成功" : "失败" 注意:不能写 var a = 10; 分支语句 循环语句,不能够带有JS关键字 例: <p>{{ count === 1 }}</p> #返回Boolean类型 <!-- count 为data中的数据 --> <p>{{ count === 1 ? "成立" : "不成立" }}</p> <p>{{ fn() }}</p> #调用方法
指令(重要)
指令位置: 起始标签
插值表达式: 更新标签中局部的内容
v-text 更新整个标签中的内容
v-html 更新标签中的内容/标签,能够渲染内容中的HTML标签(少用,容易形成危险)
v-if 和 v-show v-show本质是经过修改标签的display值
v-if="isShow" isShow: false
场景: 须要根据条件决定 元素是否显示 使用以上指令
使用: v-if 和 v-show 后面的表达式返回的布尔值 来决定 该元素显示隐藏
注意 : v-if 是直接决定元素 的 添加 或者删除 而 v-show 只是根据样式来决定 显示隐藏
v-on绑定事件:
<input type="text" @change="fn()"> #fn()默认参数为$event,methods内的函数默认第一个参数也是event
v-on:事件名.修饰符="方法名" ,v-on:能够用@代替
注意 方法名 中 能够采用$event的方式传形参 也能够直接写事件名 默认第一个参数为event事件参数
传递$event的时候,$必须加,若是不写,methods中的函数默认第一个参数为event事件参数
例:fn(count,$event)
修饰符(可不写)
.once - 只触发一次回调。
.prevent - 调用 event.preventDefault()。
获取当前input中输入的值:
#event事件中target指的是触发该事件的元素 是DOM对象
console.log(event.target.value);
@change:鼠标失去焦点输出
@input:value值变化就输出
遍历数组和对象v-for
注意 v-for写的位置 应该是重复的标签上 不是其父级元素上 须要注意 item in items // item为当前遍历属性数组项的值 (item,[index]) in items //item为当前遍历属性数组项的值 index为数组的索引 v-for 指令须要使用 item in items 或者 item of items 形式的特殊语法,in/of 同样 items 是源数据数组 /对象 <p v-for="item in list">{{item}}</p> 对象: item in items // item为当前遍历属性对象的值 (item,[ key], [index]) in items //item为当前遍历属性对象的值 key为当前属性名的值 index为当前索引的值
vue次日
v-for-key
- 场景:列表数据变更会致使 视图列表从新更新 为了 提高性能 方便更新 须要提供 一个属性 key - 使用: 一般是给列表数据中的惟一值 也能够用索引值 语法: <li v-for="(item,index) in list" :key="index">
v-if和v-for优先级
<p v-if="index>1" v-for="(item,index) in list"></p> v-for 的优先级大于v-if ,全部v-if才能使用v-for的index变量 若是遇到 v-if判断数组变量 须要在循环体外再创建一个判断 v-if <div v-if="list.length >4"> <li v-if="index>2" v-for="(item,index) in list" :key="index"> {{ item }} </li> </div>
v-bind
- 做用:绑定标签上的任何属性 - 场景: 当标签上的属性是变量/动态/须要改变的 <p v-bind:id="ID"></p> // ID为数据对象中的变量值 <p :id="ID"></p> // 简写
v-bind-绑定class-对象语法
绑定class对象语法 :class="{ class名称: 布尔值 }" <p :class="{left:showClass}">内容</p> showClass:true 若是showClass的值为true,则加上left类,若为false,则不加 <p v-bind:class="name"></p> name: "test" 加上test类 绑定class和原生class会进行合并
v-bind-绑定class-数组语法
绑定class数组语法 :class="[class变量1,class变量2..]" #绑定class和原生class会进行合并 <p :class="[activeClass,selectClass]" class="default">内容</p>
v-bind-绑定style-对象语法
<p :style="{fontSize:fontSize,color:color,fontWeight:fontWeight}">Hello world</p> 复合标签必须采用小驼峰命名 当属性名和 值的变量名一致是 能够简写 为 color:color => color <p :style="{fontSize,color,fontWeight}">Hello world</p> data: {fontSize: "48px", color: "red",fontWeight: "bold"} #data数据以下
v-bind-绑定style-数组语法
语法: :style="[对象1,对象2...]" 对象能够是多个属性的 集合 一样里面的css属性须要听从小驼峰命名的规则 例: <p v-bind:style="[obj1,obj2]" style="color:blue">Hello world</p> data: { obj1: {fontSize: "48px",color: "red", backgroundColor: "black"}, obj2: { backgroundColor: "yellow" } } 原有内联CSS会先执行,后加CSS若有重复会覆盖内联样式
v-model-基础用法
做用: 表单元素的绑定 特色: 双向数据绑定 数据发生变化能够更新到界面 经过界面能够更改数据 v-model 会忽略全部表单元素的 value、checked、selected 特性的初始值而老是将 Vue 实例的数据做为数据来源。应该在 data选项中声明初始值。 <input type="text" v-model="name" /> <p v-text="name"></p> 语法糖原理 <input type="text" @input="changeInput" :value="name" /> changeInput(){this.name = event.target.value;} 经过v-on指令和 v-bind指令 组合实现v-model效果 利用input事件,获取value实时变化的值,用v-bind绑定value的初始值与data数据一致
v-model绑定其它表单
当表单type属性为Checkbox的时候,获取的是当前表单value值 当表单type属性为Checkbox的时候,未选中默认为false,选中为true
v-cloak
解决页面初次渲染时 页面模板闪屏现象 <div v-cloak id="app"> #能够一次性 将v-cloak引用在实例视图上 避免屡次写入标签 [v-cloak] { display: none; }
v-once
- 做用: 使得所在元素只渲染一次 - 场景:静态化数据 <p>{{ name }}</p> <p v-once>{{ name }}</p> #数据再也不变化 <input type="text" v-model="name" />
全局过滤器
1. 在建立 Vue 实例以前定义全局过滤器Vue.filter() 2. Vue.filter('该过滤器的名字',(要过滤的数据)=>{return 对数据的处理结果}); 3. 在视图中经过{{数据 | 过滤器的名字}}或者v-bind使用过滤器 <p>{{ name | toUpper }}</p> #应用过滤器 1 注册过滤器 Vue.filter("toUpper", function(value) { // 2 实现过滤逻辑 return value.charAt(0).toUpperCase() + value.substr(1); });
局部过滤器
filters: { // 和全局过滤器区别只是注册位置不一样 应用范围不一样 toUpper(value) { return value.charAt(0).toUpperCase() + value.substr(1); } } filters比全局多了个s,写在Vue实例中,只有当前实例能够调用 ,和全局过滤器区别只是注册位置不一样 应用范围不一样 第一个参数永远是value,第二个参数能够是索引 过滤器可定义多个,也可一块儿使用 <p>{{ text | toUpper(2) | reverse }}</p> // 语法 多个过滤器用 | 分割
使用过滤器完成日期 格式处理
1 . 引入 第三方格式化日期插件 moment.min.js 2 . 定义格式化日期过滤器 3 . 实现其格式化功能 4 . 使用过滤 format(value, format) { return moment(value).format(format); } // 过滤器代码 <td>{{item.date|format("YYYY-MM-DD hh:mm:ss")}}</td>
vue第三天
ref 操做 DOM
- 做用: 经过ref特性能够获取元素的dom对象 - 使用: 给元素定义 ref属性, 而后经过$refs.名称 来获取dom对象 <input type="text" ref="myInput" /> // 定义ref focus() { this.$refs.myInput.focus(); } // 获取dom对象 聚焦 methods中定义方法
自定义指令-全局自定义指令
- 使用场景:须要对普通 DOM 元素进行操做,这时候就会用到自定义指令 - 分类:全局注册和局部注册 1. 在建立 Vue 实例以前定义全局自定义指令Vue.directive() 2. Vue.directive('指令的名称',{ inserted: (使用指令的DOM对象) => { 具体的DOM操做 } } ); 3. 在视图中经过"v-自定义指令名"去使用指令 v-focus // 定义指令 // 自定义指令是不须要加v-前缀的 // 第二个参数为一个对象 对象中要实现 inserted的方法 // inserted中的参数为当前指令所在元素的dom对象 Vue.directive("focus", { inserted(dom) { dom.focus(); } }); 局部自定义命令写在vm实例中
computed
计算属性中必定是同步操做,若是有异步操做,则该业务逻辑就会失败
{{newList}} //调用计算属性
computed: {
newList(){
var arr= this.list.filter(function(value,index){
return value>5;
})
return arr;
}} // 定义计算属性
axios
在npm 中引入axios文件
axios.get(url).then((res) => {
// 请求成功 会来到这 res响应体
}).catch((err) => {
// 请求失败 会来到这 处理err对象
})
表格案例
获取数据: mounted() { // 渲染完成事件 axios.get("http://localhost:3000/brands").then(result => { this.list = result.data;});} 删除数据: delItem(id) { if (confirm("肯定删除此条记录")) { axios .delete("http://localhost:3000/brands/" + id) .then(result => { this.getList(); // 从新调用拉取数据}); } } 添加数据: addItem() { // 添加商品 axios.post("http://localhost:3000/brands", { name: this.name, date: new Date() }) .then(result => { if (result.status == 201) { this.getList(); // 请求数据 this.name = ""; // 清楚文本框内容}});
watch(监听属性)
watch:{ //watch也是vm实例的一个对象 city:function(oldName,newName){ var arr = this.list.map(function(i){ i.name = newName; return i; }); this.list = arr;} }
vue第四天
组件
组件特色: 组件是一个特殊的 Vue实例
和实例类似之处: data/methods/computed/watch 等包罗万象
注意:data和Vue实例的区别为 组件中data为一个函数 没有el选项
data选项是一个函数的时候,每一个实例能够维护一份被返回对象的独立的拷贝,这样各个实例中的data不会相互影响,是独立的。
template 表明其页面结构 (有且只要一个根元素)
每一个组件都是独立的 运行做用域 数据 逻辑没有任何关联
<content-a></content-a> / //使用组件 Vue.component("content-a", { // // 组件名称 abc abcD adc-d 推荐 abc-d的模式 并且全小写 template: `<div> {{count}} </div>`, data() { return { count: 1 }; }}); // 组件可以实现数据独立 由于在data中return 了一个新的对象 // 组件中 data必须是一个函数 并且必须返回一个对象(重点) // 这是组件和Vue实例的最大区别
局部组件
局部组件写在vm实例对象内部,components:{},须要加个s components:{ "content-a": { template: ``}} 使用组件中的实例不要忘记加this
component嵌套
var comA = {template: `<div>我是子组件</div>`}; //先定义子组件 var parentA = { //再定义父组件 template: `<div> 我是父组件 <com-a></com-a> //调用子组件 </div>`, components: {'com-a': comA } //组件一样拥有注册局部组件选项 }; components: { 'parent-a":parentA} //根组件再调用父组件
组件传值
父组件→子组件
props的值能够是字符串数组 props:["绑定的属性"] , 来源于外部的(组件的外部)
父组件传递给子组件的数据是只读的,即只能够用,不能够改{{age}}
//子组件接收完属性就能够进行调用属性,不是属性值子组件→父组件
经过在子组件中触发$emit事件,而后在父组件中监视此事件 进行追踪
methods: {
selectCity() {
// this当前实例 this.属性名直接能够获取props属性值 因此props不能和data属性重名 也不能和方法重名
//console.log(this.city);
// $emit是当前实例的方法 (自定义事件名称(可随意定义),params...)
this.$emit("changecity", this.city); //抛出一个事件
}
子组件经过抛出事件,父组件定义事件接收 @changecity="change",事件名与$emit中一致,change(city)能够拿到实参
SPA
缺点
SPA-实现原理
前端自由切换模块路由
体验: <!-- router-link 最终会被渲染成a标签,to指定路由的跳转地址 --> <router-link to='/bj'>北京</router-link> //设置导航内容 <!-- 路由匹配到的组件将渲染在这里 --> <!-- 设置容器 --> <router-view></router-view> // 设置容器 <script src="./vue-router.js"></script> ///引入vue-router.js var router = new VueRouter({ //实例化一个vue-router routes:[{ //编写页面路由 配置路由表 path:'/bj', component:{ template: `<div>北京</div>` }}] router:router //将router挂载到Vue实例上 点击link标签,跳转到相应路径路由,将对应模板 显示到view上,其它模板被销毁
vue第五天
vue-router-动态路由
当页面path不一样却须要对应同一个组件时,须要用到动态路由这一律念,能够经过路由传参来实现
this.$route 获取当前路由对象 并经过params获取定义的参数id
path:"/team/:teamname", //定义动态路由
component:{
template:<div>我是{{$route.params.teamname}}队粉丝</div>
}
//{{$route.params.teamname}}{{$route.params.postname}} ,两个参数须要拿两次
路由规则 匹配路径 $route.params
/user/:username /user/evan { username: 'evan' }
/user/:username/post/:post_id /user/evan/post/123 { username: 'evan', post_id: '123' }
vue-router-to属性赋值
<!-- <router-link to="/sport">体育</router-link> --> <!-- 变量 --> <!-- <router-link :to="path">体育</router-link> --> <!-- 根据对象name跳转 --> <!-- <router-link :to="{name:'abcdefg'}">体育</router-link> --> <!-- 根据对象path跳转 --> <!-- <router-link :to="{path:'/sport'}">体育</router-link> --> <!-- 带参数的跳转 --> <router-link :to="{name:'abcdefg',params:{a:1}}">体育</router-link>
注意:若是提供了 path,params 会被忽略,上述例子中的name并不属于这种情,你能够提供路由的 name 并手写完整的参数params:**
vue-router-重定向
当但愿某个页面被强制中转时 可采用redirect 进行路由重定向设置
path: "/sport", redirect: "/news", // 强制跳转新闻页
vue-router-编程式导航
能够经过vue实例 获取当前的路由实例 $router
goPage() { // 跳转到新闻页面 this.$router.push({ path: "/news"});}
vue-router-routerlink-tag-激活样式
当前路由在导航中是拥有激活class样式的,设置激活class样式便可 <a href="#/news" class="router-link-exact-active router-link-active">新闻</a>
vue-router-嵌套路由
注意,以 / 开头的嵌套路径会被看成根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。
{
path:'/music',
children:{
path:'/pop' }} //此时该条路由 就是 /pop
// 若是想使用 /music/pop 能够这样
{
path:'/music',
children:{
path:'/music/pop' }} //此时该条路由 就是 /music/pop
// 或者
{
path:'/music',
children:{
path:'pop' }} //此时该条路由 就是 /music/pop
二级路由须要写在一级路由的组件中,包括视图
{
path:"/hx",
//二级路由要写在组件中
component:{
template:<div> 我是化学 <router-link to="/hx/h2">语文</router-link> <router-link to="/hx/o2">数学</router-link> <router-link to="/hx/h2o">外语</router-link> <router-view></router-view> </div>
},
children:[{
path:"/hx/h2",
component:{
template:
<div>语文</div>
}},
{
path:"/hx/o2",
component:{
template:
<div>数学</div>
}},
{
path:"/hx/h2o",
component:{
template:
<div>外语</div>
}
}]
},
CSS 过渡和动画 中自动应用 class
Vue 提供了 transition 的封装组件,在下列元素更新,移除,新增 情形中,能够给任何元素和组件添加进入/离开过渡
<button @click="show=!show">显示/隐藏