之前总结过一次,但是总结的太随便,这次复习基础知识重新好好理一遍!
一、起步内容总结
1.helloworld示例
el:接管区域
data:定义的变量
使用vue 不用再直接操作DOM
如果想要setTimeout改变页面内容,不用再操作DOM啦 我们只需要把精力放在数据得管理上就好啦
2.开发todolist
todolist是最最最最基础的小功能,这个不会写就完犊子了
</head> <body> <div id="app"> <input type="text" v-model="inputValue"/> <button v-on:click="handleBtnClick">提交</button> <ul> <li v-for="item in list">{{item}}</li> </ul> </div> <script> var app = new Vue({ el: '#app', data: { list: [], inputValue: '' }, methods: { handleBtnClick: function() { this.list.push(this.inputValue) this.inputValue = '' } } }) </script> </body> </html>就是个小小的demo 所以就用script标签引入vue就得了
v-for:循环项目
v-on:事件=“xxx” :绑定事件 指向xxx事件处理程序
v-model=“xxx" :双向绑定 input框发生内容和inputValue绑定后 一个变了 另一个也跟着变
methods:方法 定义函数
注意:当在methods理使用this的时候 this指的是整个app,不过在使用点操作符的时候,会默认先到data里面寻找
3.MVVM
传统的前端设计逻辑是MVP
M 模型 V 视图 P 控制器 核心是控制器 而控制器的主要内容又是进行DOM操作
而MVVM
核心是M层
说白了 MVP面向DOM操作 MVVM则面向数据操作
4.前端组件化
每个组件也都是vue实例
使用组件化思想修改一下todolist
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>TodoList</title> <script src="./vue.js"></script> </head> <body> <div id="root"> <div> <input type="text" v-model="todoValue"/> <button @click="handleBtnClick">提交</button> </div> <ul> <todo-item v-bind:content="item" v-for="item in list"> </todo-item> </ul> </div> <script> // Vue.component("TodoItem", { // props: ['content'], // template: "<li>{{content}}</li>", // }) var TodoItem = { props: ['content'], template: "<li>{{content}}</li>" } var app = new Vue({ el: "#root", components: { TodoItem: TodoItem }, data: { todoValue: "", list: [] }, methods: { handleBtnClick: function() { this.list.push(this.todoValue) this.todoValue = "" } } }) </script> </body> </html>v-bind:向子组件传入一个绑定值的意思
template:模板 子组件的内容
props:接收父组件传来的值
但组件又分为全局组件和局部组件:
全局组件:
Vue.component("TodoItem", { props: ['content'], template: "<li>{{content}}</li>", })
局部组件:
var TodoItem = { props: ['content'], template: "<li>{{content}}</li>" }
局部组件还需要在vue实例中注册一下
components: { TodoItem: TodoItem },说完了组件
那不得不提组件间传值:
刚刚已经用到了父组件向子组件传值——使用v-bind 传递和props接收
那么如何从子组件向父组件传值呢——
- 子组件使用 $emit 向外触发自定义事件 并传出参数 this.$emit("delete",this.index)
- 父组件使用v-on= 认真聆听 听到事件了 就进行相应的改变
二、VUE基础
vue生命周期函数:
样式绑定:
class对象绑定 也可以使用style
可以通过对象的形式绑定 也可以通过数组的形式绑定
条件渲染:
v-if:决定一个标签是否在页面展示
v-else
v-else-if:要和v-if紧贴在一起使用
v-show:和v-if类似 但是v-show哪怕是false 该标签的dom也在页面上存在
key值:加上key值就是唯一的元素 key值不一样就不会被复用
列表渲染:
可以循环数组和对象
v-for="(item,key,index) of list" 、
可以循环对象或数组 循环数组不用key
可以在循环上带上key值提高性能
只有以下几个方法 ,或者,改变引用对象 才能又改变数组,又改变页面显示:
pop push shift unshift splice sort reverse
如果只使用下标进行修改,则页面不会改变
对象如果也想做这种改动,就需要改动引用
template:可以包裹一些循环元素 但不会被真正的渲染到页面上
set:
Vue.set(vm.userInfo,1,5)
vm.$set(vm.userInfo,2,10)
也可以使用 set方法 改变对象内容 同时改变页面
set是对象的方法 也是实例的方法
事件绑定:
获取点击事件的详情 可以通过 handleClick 或者 handleClick($event)
一些事件修饰符:
prevent stop self (只有在e.target=e.currentTarget) once capture(事件捕获 从外向内)
还有按键修饰符
.enter .tap .esc …………只有按下这些键后才执行
系统修饰符 类似按键修饰符
.ctrl .meta .shift .alt
鼠标修饰符
@click.right .left .middle
表单绑定:
v-model 可以实现双向绑定
<input v-model="value/>
{{value}}
可以绑定文本框 文本域 复选框 单选框 下拉选择菜单(select option)
v-model.lazy 偷懒 过一会 失去焦点以后再双向绑定
v-model.number:输入内容可以被转换为数字 就转换为数字 不然默认的是字符串。
v-model.trim:和ES6中的一样 去掉首位的空格
小结:
实例 new vue
模板语法
计算属性 避免冗余
样式绑定:class style 通过对象或数组
条件渲染:v-if v-else-if v-else
列表渲染:v-for
事件处理
表单绑定:v-model
组件部分:
is 属性 <tr is = "row")
在子组件中 定义data时 必须是一个函数 不能直接用data:{ } 需要用 data:function( ) { }
在vue中可以通过 ref 获取dom 节点 this.$refs.refname
父子组件传值:
有单向数据流 子组件只能使用父组件传过来的参数 不能修改 但是可以拷贝一个副本 修改副本
父组件向子组件传值 通过属性传递
子组件向父组件传值 (子组件不能随意修改父组件的值)通过触发事件 向父组件传值
组件参数校验:
给组件绑定原生事件:
@click.native
非父子组件传值:
总线机制/BUS/观察者模式:
vue中使用插槽:<slot> 可以更方便的向子组件传内容 可以给插槽起名字
<slot name="name">
作用域插槽 必须是<template slot-scope="props">
动态组件:<component :is="type">
v-once:只渲染一次
Vue 动画效果:<transition>
本章小结:
xxx.vue的文件就是一个单文件组件
路由就是根据网址不同,返回不同的内容给用户
<router-view/>显示的是当前路由地址所对应的内容
<router-view/>
header: <style lang="stylus" scoped>通过 设置 scoped 保证该部分的样式只对这个文件起作用