简短的文章介绍:这个是我学vue时的学习笔记。前面“2-3”形式的是学习慕课网的一个课程,没学完。中间有一个“vue文档”。后面的“P4”形式的是跟b站技术胖的Vue2.x基础免费视频。目前同时在看《Vue.js快跑》,如果有需要记录的点,会加以补充。
好像这么弄有些乱,会花些时间重新整理一下的。
2020.6.20 目前在学coderwhy王红远老师的vue课,会对下面的知识点有补充
Vue的核心是将数据显示在页面上,这一功能通过模板(Template)实现。为正常的HTML添加特殊的属性——被称作指令(Directive)——借助它来告诉Vue我们想要实现的效果以及如何处理提供给它的数据(Data)。——-《Vue.js快跑》
某一天突然发现vue报错,比如“ Vue is not defined”或者是“[Vue warn]: Cannot find element: #app”,莫名其妙不行,又莫名其妙可以...贴一个能运行的代码,以后不行的时候直接拿去调。感觉浏览器对代码格式要求比较严格,格式乖乖按照缩进弄吧
new document
哭了 bug在哪里啊啊啊啊啊啊啊啊
{{ message }}
vue的编程范式是声明式编程,区别于js的命令式编程
js的命令式编程
// 1.定义数据
let message = 'Hello Vuejs'
// 2.获取DOM
const appDom = document.querySelector('#app')
// 3.将message设置到DOM中
appDom.innerText = message
// 4.修改message,并且将新的message赋值到DOM中
19.12.27更新:可以将vue.js的文件下载下来,然后引用。
开发环境 https://vuejs.org/js/vue.js
生产环境 https://vuejs.org/js/vue.min.js
__________________
条件渲染:v-if、v-else、v-else-if、v-show。v-show不支持 元素,也不支持v-else
new document
= 0">
情况一:count大于等于0,count的值是:{{count}}
= -5">
情况二:count大于等于-5且小于0,count的值是:{{count}}
情况三:count小于-5,count的值是:{{count}}
满足show的条件,显示show:{{count}}
v-if vs v-show
v-if(判断是否加载)。是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:如果在初始渲染时条件为假,那么这个元素不会被插入DOM——直到条件第一次变为真时,才会开始渲染条件块。
相比之下, v-show (改的是display的值)就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
v-if 有更高的切换开销,每次插入或者移除元素时都必须要生成元素内部的DOM树,这在某些时候是非常大的工作量。而 v-show 除了有更高的初始渲染开销外没有额外的开销。如果希望频繁地切换某些内容,v-show更好。
模板中的循环——该指令通过遍历一个数组或者对象,将指令所在的元素循环输出到页面上。
参数顺序:(value, key)
源码:需要哪个循环就写在哪个标签上。比如要
list为数组:
{{item}}
list为数组对象:
输出item:{{item}}
输出名字item.name:{{item.name}}
输出结果:
v-for与v-show一起使用:
姓名:{{item.name}},年龄:{{item.age}}
24">
年龄大于24的人有:{{item.name}}
源码:
new document
计算属性:computed。在输出data数据前进行的编程
侦听器:watch 侦听器的属性方法有两个参数:newval(新值),oldval(旧值)。可通过F12的Console窗口修改属性,从而激活这个方法
watch还会用在http的请求
使用场景:
watch:异步场景
computed:数据联动(因为加了this)
watch监听的是一个变量或者是一个常量的变化,变量是单一的变量或数组。
computed可以监听很多的变量,但是变量要在vue的实例里面
源码:
new document
{{msg}}
{{msg1}}
最后一个的测试例子:(在chrome的console处运行)
arr = '123';//"123" app.another = 'hohoho';
条件渲染:v-if、v-else、v-else-if、v-show(是用在html里的)。v-show不支持 元素,也不支持v-else(√)
列表渲染:v-for、v-for与v-if结合使用、v-for的高阶使用(√)
Class与Style绑定:属性绑定用v-bind。v-bind:class="..." 或 v-bind:。效果:自动在html里添加对应的类和css属性
3.属性绑定
姓名:{{item.name}},年龄:{{item.age}}
24" : :class="['banana','more',{'another':item.age < 26}]">
年龄大于24的人有:{{item.name}}
首先:class有两种写法 ①:class="{'类名':(true or false)}" ② :class="['类名','类名',{'类名':(true or false or判断语句)}]"
疑问:类名是不是一定要加单引号?我遇到的大部分都要加,不然是没反应的。如果不加,要另外在data对象里声明类名,比如有:
,在data对象里增加: classA:'classA', classB:'classB'绑定的class和style都会加在每个div中,除了another类,因为该类只有年龄小于26才加。style中每个div都会有color和text-shadow属性,但是年龄小于24的张三会多一个“display:none”,所以他的名字没有显示出来。
如果将张三的年龄修改一下,就会显示出来了
v-if vs v-show
v-if(判断是否加载)。是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下, v-show (改的是display的值)就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。
条件渲染—用 key 管理可复用的元素
new document
key
属性,具有唯一值。用来表达“这两个元素是完全独立的,不要复用它们”。有key和无key属性的区别:输入框是否被重新渲染。在F12可看出,无key的话每次点击按钮更新的是label和placeholder,有key的话还会更新的divvue.js官方文档—组件基础—监听子组件事件
对props里的post不太能理解。谁是父组件,谁是子组件?
new document 将事件处理函数改成一个方法onEnlargeText:
new document 以下来源技术胖的Vue2.x基础免费视频。
视频讲的比较详细了,一个个实例对着做会有收获的。但后面会讲的就比较匆忙了,只介绍每个知识点,没有把知识点串起来。
对应的github练习代码:https://github.com/Clara-hy/exercise/tree/master/Code/Vue
[第一季]P4:v-text & v-html
{{ }}有个弊端,就是当Vue出错或者网速慢没渲染出来时,会将变量名显示到页面。而这一弊端可以用v-text克服。
而v-html是当data数据存在html标签时用的。但工作时一般不用,会遭到xss攻击
P6: v-model数据源绑定
1.双向数据绑定最最简单的例子
v-model v-model实例
{{message}}
2.v-model有几个修饰符
2.1 lazy: v-model.lazy懒加载:当鼠标离开文本框时才更新数据
2.2 number: v-model.number:只有当文本框内容是数字时才会实现数据绑定,如果是数字+其他字符,只输出数字。如果是字符串+数字,那会连同字符串一起输出
2.3 trim: v-model.trim:去掉文本框的空格
3. 双向数据绑定常用于表单
P8: v-pre & v-cloak & v-once
v-pre:对{{ message }}进行原样输出,不进行数据的渲染。即以'{{ message }}'的形式输出
v-cloak:渲染完成后才显示
v-once:只进行一次渲染
[第二季:全局API]P9:Vue.directive 自定义指令
P10:Vue.extend 扩展实例构造器
Vue构造器:用来生成Vue的实例对象
vue.extend 通常会和组件结合一起用
P11:Vue.set
Vue.set存在的意义是,当虚拟dom值里只改变数组(如果同时改变其他变量,那vue是能顺便监测到数组变化的),而且是通过下标来改变数组时,vue是监测不到的(实际上是js的缺陷)。所以vue提供了vue.set方法让我们能在外部监测到变化。
P12:钩子函数
最常用的:做loding。通常应用在单页面应用。比如created加载loding动画,在mounted(挂载完成之后)结束动画,然后显示正常界面。P13:Template制作模板
做组件肯定要做一个模板的???
三种方法:①用反引号直接写html代码:
var app = new Vue({ el:'#app', data:{ message:'hello world!' }, template:`
我是选项模板
` });②在标签里建模板
③在
路由中的钩子
有两个:①进路由前 ②离开路由前
配置也有两种方法:①在路由配置文件(index.js)中写钩子函数(在这个文件只能写beforeEnter,不能写“离开路由前”) ②在模板中写钩子函数(两个钩子函数都能写,比较通用)
钩子函数的参数:to,from,next。next相当于一个开关,指定能否跳转next(true) or next(false)以及跳转到哪里next({path:"/"})。
编程式导航
在App.vue里的script里写跳转链接。比如栗子一:实现“前进”、“后退”:this.$router.go(-1);页面的按钮。栗子二:登录成功后跳转到某一页面:this.$router.push('/xxx');
P42Vuex
组件之间的所有通信都采用事件(events)方式(子组件往父组件通信)和属性(props)方式(父组件往子组件通信),简单的应用场合还行,但稍微复杂一点就不太行了。
vuex:数据仓库,管理的是状态,也叫状态管理器。应用在中大型项目、数据共用的地方。
state:访问状态对象
//@/vuex/store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex);//vuex已经集成到我项目中啦! // 状态对象 const state={ count:1 } // 要改变state里的值需要用到mutations里的方法 // mutations:改变状态对象的方法 const mutations={ add(state){ state.count++; }, reduce(state){ state.count--; } } export default new Vuex.Store({ state, mutations }) // @/components/count.vue
{{msg}}
{{$store.state.count}}
问题来了:如何将count.vue的里的{{$store.state.count}}转换成{{count}}使用呢?三种方法:
//count.vue //方法一