# vue-easy **Repository Path**: noviceLuo/vue-easy ## Basic Information - **Project Name**: vue-easy - **Description**: vue单功能学习 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-11-07 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue-easy ## 介绍 vue单功能学习 ## 问题 ``` 学习Lodash高效js库 JSX渲染函数 如何编写,什么时候使用? 函数式组件如何使用? 如何使用Vuex-model模块? 如何使用proviue/inject? 了解watch-API 自定义事件 未看懂? ``` ## 杂项 >1.单元测试 ``` 使用场景 1.通用性组件 2.工具类 ``` >2.key ``` 当元素绑定一个的key被修改后对应标签也会被重新销毁并挂载 ``` ## 单词 ``` ViewModel component template beforeCreate created beforeMount mounted 挂载完成 beforeUpdate 准备更新 =>() updated 更新完毕 beforeDestroy 准备销毁 =>(解除绑定、销毁子组件及事件监听器) destroed 销毁完毕 data prop computed 计算属性 watch 监听属性 methods 方法 ------------------------ 数组变异方法: push pop shift unshift splice sort reverse 非变异 filter concat slice ------------------------ modifier 修饰符 render Mustache 双括号 kebab-case 短横线分隔命名 PascalCase 首字母大写命名 .$forceUpdate 强制更新 vm.$forceUpdate() ``` ## 修饰符 ``` 事件 .prevent 阻止默认行为(跳转、重载页面) event.preventDefault() .stop 阻止事件继续传播 .capture 添加事件监听器时使用事件捕获模式(即内部元素触发的事件先在此处理,然后才交由内部元素进行处理) .self 只有当 event.target 是当前元素自身时触发处理函数 .once 将只会触发一次 .passive 滚动事件的默认行为 (即滚动行为) 将会立即触发,而不会等待 `onScroll` 完成。这其中包含 `event.preventDefault()` 的情况;(不要把 .passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive 会告诉浏览器你不想阻止事件的默认行为。) .native 自定义组件直接监听一个原生事件 ------------------------------- 键盘 .enter .tab .delete .esc .space .up .down .left .right ``` ### 2019 11-07 日志(教程->模板语法) >1.Vue.js是什么 ``` vue是一套用于构建用户界面的渐进式框架。 ``` >2.vue-指令(只能写表达式,不能写业务逻辑) ``` v-once 渲染一次Dom v-html 可解析html元素 v-text 挂载文本元素 {{}} 挂载文本元素 v-model 双向数据绑定 v-if 条件判断,不满足时销毁dom v-else-if v-else v-show display: none v-bind 绑定值,简写: v-on 绑定事件 @ v-for 循环数组、对象(value, key, index) ``` >3.数据渲染机制 ``` 当一个Vue实例被创建时,它将data对象中的所有的属性加入到Vue的【响应式系统】中。当这些属性的值发生改变时,视图视图将会产生“响应”,即匹配更新为新的值。 当数据发生改变时,视图会进行重新渲染。值得注意的是只有当实例被创建时就已经存在于【data】中的属性才是响应式的。也就是说如果你添加一个新的属性,将不会触发任何视图的更新。如果你知道你会在晚些时候需要一个属性,但是一开始它为空或不存在,那么你仅需要设置一些初始值。 Object.freeze()会阻止修改现有的属性,也意味着响应系统无法在跟踪变化。 ``` >4.动态参数-(指令) ``` 对动态参数的值的约束: 动态参数预期会求出一个字符串,异常情况下值为null。这个特殊的null值可以被显性地用于移除绑定。任何其它非字符串类型的值都将会触发一个警告。 对动态参数表达式的约束: -> 【编译警告】 某些字符: 空格和引号,放在HTML attrbute名里面是 无效的。 在DOM中使用模板时,还需要避免使用大写字符来命名键名,因为浏览器会把attribute名全部强制转为小写 -> 在DOM中使用模块时会被转为 v-bind:[someattr]。除非在实例中有一个名为“someattr”的 property,否则代码不会工作。 ``` >5.v-model ``` 在input中 v-model 是 :value=val 和 @input=enevt 的简写 在checkbox和radio使用 checked属性和change事件 在select 将value作为prop,并将change作为事件 自定义v-model(09节4.50s未理解) ``` ### 2019 11-8日志(教程-组件基础) >1.计算属性和监听器 ``` 计算属性: 计算属性是基于它们的【响应式依赖】进行缓存的,只有在相关响应式依赖发生改变时他们才会重新求值。 每当触发重新渲染时,调用才会再次执行函数。 computed: { // 只触发一次 now: function () { return Date.now() } } 计算属性默认只有getter,可以添加setter属性 watch:(https://cn.vuejs.org/v2/api/#vm-watch) 使用watch选项允许我们执行异步操作(如访问API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。 ``` >2.Style绑定 ``` 1. :style绑定属性系统会内置添加前缀 2. 自定义组件定义属性时会覆盖最外层元素的属性,style、class会追加。如果最外层元素属性不想被替换和覆盖可以在自定义组件添加(inheritAttrs: false) ``` >3.条件渲染 ``` 当v-if和v-for一起使用时,v-for比v-if优先级更高。 ``` >4.事件处理 ``` 有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法 v-on:click="enevt($event)" ``` >5.自定义组件的v-model ``` 第一步:指定 prop(值),指定event(事件) 第二步: 通过props接收值 第三步:元素触发事件 $emit('指定事件') ``` >6.解析DOM模板时注意事项 ``` 有些HTML元素,如ul、ol、table、select,对于哪些元素可以出现在其内部是有严格限制的。而有些元素如li、tr、option,只能出现在它某些特定的元素内部。
``` >7.单项数据流 ``` 每次父组件发生更新时,子组件中所有的prop都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变prop。 props: ['name], data() { return { newName: this.name // 方法一: 另存 } }, computed: { lowerCaseName() { return this.name.toLowerCase() // 方法二: 需要进行转换值 } } ``` ### 2019 11-11日志(教程-动态组件 & 异步组件) >1.Prop ``` 1.禁用特性继承 如果你不希望组件的根元素继承特性,你可以在组件的选项中设置inheritAttrs: false。 Vue.component('my-component', { inheritAttrs: false, // ... }) 这尤其适合配合实例的 $attrs 属性使用,该属性包含了传递给一个组件的特性名和特性值。 有了 inheritAttrs: false 和 $attrs,你就可以手动决定这些特性会【被赋予哪个元素】。在撰写基础组件的时候是常会用到的: Vue.component('base-input', { inheritAttrs: false, props: ['label', 'value'], template: ` ` }) // 把值赋给lable->包裹的 input ``` >2.自定义事件 ``` 1.子组件向父组件传递自定义事件 this.$emit('myEvent') 2.将原生事件绑定到组件 3.属性$listeners属性,作用在组件上的所有监听器(未理解) 4.(.sync)修饰符 ``` >3.动态组件 & 异步组件 ``` ``` ### 2019 11-18日志(教程-过渡&&动画) >1.访问根实例($root) ``` 1.内联模板 当inline-tamplate这个特殊的特性出现在一个子组件上时,这个组件将会使用其里面的内容作为模板,而不是将其作为分发的内容。这使得模块的撰写工作更加灵活。

desc

2.X-Template 3.强制更新 $forceUpdate ``` >2.过渡 & 动画 ``` 1.vue提供了transition封装组件,在下列情况中,可以给任何元素和组件添加进入/离开过渡 条件渲染(使用v-if) 条件展示(使用v-show) 动态组件 组件根节点 2.过渡的类名 在进入/离开的过渡中,会有6个class切换 v-enter: 定义进入过渡的开始状态。在元素被《插入之前生效》,在元素被《插入之后的下一帧移除》。 v-enter-active:定义进入过渡生效时的状态。在《整个进入过渡》的阶段中应用,在元素被插入之前生效,在过渡/动画《完成之后》移除。这个类可以用来定义进入过渡的过程时间,延迟和曲线函数。 v-enter-to: 定义进入过渡的结束状态。在元素被插入之后下一帧(与此同时v-enter被移除),在过渡/动画完成之后移除。 v-leave: 定义离开过渡的开始状态。 v-leave-active:定义离开过渡生效的状态。 v-leave-to: 定义离开过渡的结束状态。 类名定义:《name》 默认前缀 v- 自定义前缀: 解析为 my-name-enter 3.自定义过渡类名(可以和第三方CSS动画库结合使用Animate.css) enter-class enter-active-class enter-to-class leave-class leave-active-class leave-to-class 4.同时使用过渡和动画 type特性设置 animation 或 transition 5.显性的过渡持续时间 定制一个显性的过渡持续时间 duration 定制进入和移出的持续时间 6.JavaScript钩子 @before-enter @enter @after-enter @enter-cancelled @before-leave @leave @after-leave @leave-cancelled 当只用javascript过渡的时候,在enter 和 leave中必须使用 done 进行回调。否则,它们将被同步调用,过渡会立即完成。 推荐对于仅使用javascript过渡的元素添加 v-bind:css="false",vue会跳过css检测,这也可以避免过渡过程中css的影响。 7.初始渲染的过渡 可通过appear特性设置节点在初始渲染的过渡 自定义类名 appear appear-class appear-to-class appear-active-class 自定义javascript钩子 @before-apper @appear @after @appear-cancelled 8.过渡模式 mode: in-out: 新元素先进行过渡,完成之后当前元素过渡离开。 out-in: 当前元素先进行过渡,完成之后新元素过渡进入。 9.过渡列表 不同于tansition,它会以一个真实元素呈现,默认为一个 span 。你可以通过tag特性更换为其它元素。 过渡模式不可用,因为我们不在互相切换特有的元素。 内部元素总是需要提供唯一为key属性值 css过渡的类将会应用在内部元素中,而不是这个组/容器本身。 ``` ### 2019 11-19日志(教程-混入~) >1.混入 ``` 1.基础 当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行合并。发生冲突时以组件数据优先。 同名钩子函数将合并为一个数组,因此都将被调用。《混入对象的钩子》将在组件自身钩子《之前调用》。 值为对象的选项,例如:methods、components和directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。 2.全局混入 注意: 一旦使用全局混入,它将影响每一个之后创建的Vue实例。 Vue.mixin({ }) ``` >2.自定义指令 ``` 1.注册一个全局自定义指令 Vue.directive('focus', { // 当被绑定的元素插入到DOM中时 inserted: function (el) { // 聚焦元素 el.focus() } }) 2.注册局部指令 directives: { focus: { inserted: function (el) { el.focus() } } } 3.钩子函数 网址(https://cn.vuejs.org/v2/guide/custom-directive.html#%E9%92%A9%E5%AD%90%E5%87%BD%E6%95%B0) 4.钩子函数参数 网址(https://cn.vuejs.org/v2/guide/custom-directive.html#%E9%92%A9%E5%AD%90%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0) 除了el之外,其它参数都应该是(只读)的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的dataset来进行。 5.动态指令参数 网址(https://cn.vuejs.org/v2/guide/custom-directive.html#%E5%8A%A8%E6%80%81%E6%8C%87%E4%BB%A4%E5%8F%82%E6%95%B0) 6.函数简写 在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如这样写: Vue.directive('color-swatch', function (el, binding) { el.style.backgroundColor = binding.value }) 7.对象字面量 如果指令需要多个值,可以传入一个javascript对象字面量。记住,指令函数能够接受所有合法的javascript表达式。
Vue.directive('dome', function (el, binding) { console.log(binding.value.color) console.log(binding.value.text) }) ``` >3.渲染函数 & JSX (未理解) ``` 1.基础 网址(https://cn.vuejs.org/v2/guide/render-function.html#%E5%9F%BA%E7%A1%80) 2.虚拟DOM return createElement('h1', this.title) ```