摘要:以下内容根据部分速记。同时,需要在父组件标签中添加这个属性,该属性才能传递到子组件内。把父组件传递的数据当做子组件的初始值。
以下内容根据Vue.js Guide Essentials部分速记。
不含动画/mixin/SSR/路由/状态管理等部分.
建议阅读原文 https://vuejs.org/v2/guide/in...
什么是VueThe Vue Instance
开始
声明式渲染
条件与循环
处理用户输入
组件
建议阅读原文 https://vuejs.org/v2/guide/in...
创建Vue实例Template Syntax
data & methods
实例生命周期及其钩子函数
生命周期图表
模板语法 https://vuejs.org/v2/guide/sy...
Mustache模板中插入值html标签内的文本:使用{{变量名}}
原始html:标签属性内使用v-html="变量名"
标签内的属性:v-bind:属性名="变量名"
也可用JS的表达式来替换上述"变量名",但只能是单条表达式,不能是语句
argument:如v-bind:href中的href
modifier:如v-on:submit.prevent="onSubmit"中的.prevent
v-bind:href等同于:href
v-on:click="doSth"等同于@cllick="doSth"
https://vuejs.org/v2/guide/co...
Computed Propertiesjs内的computed函数
computed属性会被缓存,出于性能考虑,不建议在{{}}中的表达式内执行method
computed属性会被缓存,即使是一个函数,也并不会每次都执行
computed是根据已有变量计算出的新变量
watch用来监视已有变量,执行进一步操作.
Class and Style Bindings(html标签中的)class与style绑定 https://vuejs.org/v2/guide/cl...
classv-bind:class内的表达式会自动和class内已有class同时存在
可以:data: { isActive: true, hasError: false } 结果: 也可以: data: { classObject: { active: true, "text-danger": false } }
也可以使用computed函数计算出的属性值/对象为class内的属性值/对象做数据来源
也可以使用数组来应用多个class名:
data: { activeClass: "active", errorClass: "text-danger" } 结果:
与其在array内使用三目运算符,不如嵌套使用object与array:
使用js定义组件时的class先出现,使用组件时添加的class(无论直接使用class还是v-bind:class)后出现.
Vue.component("my-component", { template: "style 内联样式 " }) 1.结果: 2. 结果:
和class很像,但必须是object
可以: data: { activeColor: "red", fontSize: 30 } 也可以: data: { styleObject: { color: "red", fontSize: "13px" } } 也可以使用computed 也可以用对象数组: (baseStyles/overridingStyles都是object)
使用v-bind:style会自动加上prefix
也可以手动加:
Conditional Rendering
条件渲染 https://vuejs.org/v2/guide/co...
v-if/v-else/v-else-ifYes
也可以配合else使用:No
v-if可以和template元素结合使用,最终结果不包含template标签:
Title
Paragraph 1
Paragraph 2
v-else必须紧跟v-if或v-else-if
v-else-if:
ABCNot A/B/C
v-else-if必须紧跟v-if或v-else-if
相同元素自动复用:
修改loginType的值不会产生新的input元素
会自动复用之前的元素
如果想避免自动复用,给input标签加上不同的key:
(label标签依然会被复用,因为没有指定key)v-show
只控制css的display.
不支持template元素,不支持和v-else同时使用
经常切换显示隐藏,使用v-show
偶尔显示,变动少,使用v-if
v-for的优先级高.(见下一节)
List Rendering列表渲染 https://vuejs.org/v2/guide/li...
v-for遍历arrayv-for内部可以访问外部的所有变量,
还可以获取index:
或者:
{{ key }}: {{ value }}{{ index }}. {{ key }}: {{ value }}(有index/键名/值)
内部引擎使用Object.keys()来遍历,不保证所有浏览器都表现一致
key如果数据的顺序变动,vue不是调整各个子元素的顺序,而是直接修改现有子元素的内容
为了规避以上情况,可以给每个子元素绑定key:
探测数组更改情况
以下的数组方法都已经被Vue封装好,vue可以观察到原有数组的更改
push() pop() shift() unshift() splice() sort() reverse()
替换数组:
filter() concat() slice() ...
以上方法不改变原有数组,直接返回新数组.
vue的使用方法如下:
example1.items = example1.items.filter(function (item) { return item.message.match(/Foo/) })数组更改警告
由于JS的限制,以下两种情况无法被vue观察到,请使用替代方案:
直接用索引设置某项的值
// Vue.set Vue.set(example1.items, indexOfItem, newValue) 或者 // Array.prototype.splice example1.items.splice(indexOfItem, 1, newValue)
修改数组的长度
example1.items.splice(newLength)对象更改警告
由于JS限制,vue观察不到动态添加根级别的属性到已有的实例:
var vm = new Vue({ data: { a: 1 } }) // `vm.a` is now reactive vm.b = 2 // `vm.b` is NOT reactive
但是允许内层的object添加属性:
var vm = new Vue({ data: { userProfile: { name: "Anika" } } }) 可以使用 Vue.set(vm.userProfile, "age", 27) 或者 vm.$set(this.userProfile, "age", 27)
如果需要更新多个属性,直接使用添加属性后的新对象替换原有对象,
不要:
Object.assign(this.userProfile, { age: 27, favoriteColor: "Vue Green" })
而应该这样:
this.userProfile = Object.assign({}, this.userProfile, { age: 27, favoriteColor: "Vue Green" })筛选与排序
不对原始数据修改,仅对需要显示的作筛选排序等.
灵活运用computed或methods:
computed:
v-for可以直接遍历整数:
v-for on a{{ n }}
与v-if类似,可以结合template使用
v-for has a higher priority than v-if.
v-if将在每个for循环内都执行
如果想先if出结果,再for循环,请嵌套使用(也可用template):
No todos left!
v-for与组件可以在自定义组件内使用v-for,就像其他普通元素一样.
在组件内使用v-for, :key为必须的
但仍需注意父子组件之间的数据传递.
(子组件的js内使用props, 标签内使用v-bind:变量名,使用$emit与父组件通信)
事件处理 https://vuejs.org/v2/guide/ev...
标签内使用v-on:事件名="xxx"
xxx可以是表达式(直接修改数据)
var example1 = new Vue({ el: "#example-1", data: { counter: 0 } })The button above has been clicked {{ counter }} times.
也可以是method方法名
var example2 = new Vue({ el: "#example-2", data: { name: "Vue.js" }, // define methods under the `methods` object methods: { greet: function (event) { // `this` inside methods points to the Vue instance alert("Hello " + this.name + "!") // `event` is the native DOM event if (event) { alert(event.target.tagName) } } } }) // you can invoke methods in JavaScript too example2.greet() // => "Hello Vue.js!"
也可以是一段js语句,可以选择性地传递参数到method内:
new Vue({ el: "#example-3", methods: { say: function (message) { alert(message) } } })
可以传递原始的DOM event参数,使用$event:
// ... methods: { warn: function (message, event) { // now we have access to the native event if (event) event.preventDefault() alert(message) } }Event Modifiers 事件修饰符
可以多个同时使用,也可以只使用修饰符,不指定事件handler
.stop 停止向上传播 .prevent preventDefault .capture 捕获子元素内已处理的事件 .self 只管本元素的事件,不考虑子元素 .once 触发至多一次,可以用在组件的自定义事件中
修饰符是有顺序的.
Therefore using @click.prevent.self will prevent all clicks while @click.self.prevent will only prevent clicks on the element itself.
完整的按键修饰符:
.enter .tab .delete (captures both “Delete” and “Backspace” keys) .esc .space .up .down .left .right
自定义按键修饰符:
// enable `v-on:keyup.f1` Vue.config.keyCodes.f1 = 112自动按键修饰符
可以根据KeyboardEvent.key的名称,转换为小写-小写的形式,作为按键修饰符.
如: .page-down
In the above example, the handler will only be called if $event.key === "PageDown".系统按键修饰符
.ctrl .alt .shift .meta
Note: On Macintosh keyboards, meta is the command key (⌘). On Windows keyboards, meta is the windows key (⊞). On Sun Microsystems keyboards, meta is marked as a solid diamond (◆). On certain keyboards, specifically MIT and Lisp machine keyboards and successors, such as the Knight keyboard, space-cadet keyboard, meta is labeled “META”. On Symbolics keyboards, meta is labeled “META” or “Meta”..exact
多带带按某个键,而不是组合按键中的其中一个键
鼠标按钮修饰符
.left .right .middleForm Input Bindings
表单输入绑定 https://vuejs.org/v2/guide/fo...
input(输入框、单选、多选)、textarea、select单选多选 等
v-model,将忽略任何标签上的初始值,只把vue实例的data作为数据来源
input text textarea input checkbox单选一 一个checkbox绑定到一个v-model,data为Boolean
多选多 多个checkbox绑定到同一个v-model,data为数组
多选一 多个input radio绑定到同一个v-model,data为字符串,结果为input标签内的value
select单选 建议第一项为一个disabled的option
多选,添加multiple属性
radio/select options的v-model为字符串,checkbox为布尔值
可以把v-model与自定义的value值做绑定,而不是浏览器默认的value值.
// when checked: vm.toggle === "yes" // when unchecked: vm.toggle === "no" // when checked: vm.pick === vm.a // when selected: typeof vm.selected // => "object" vm.selected.number // => 123修饰符
转换为数字类型 去空格Components
组件 https://vuejs.org/v2/guide/co...
使用组件https://vuejs.org/v2/guide/co...
全局注册、局部注册
data必须是一个函数
父子组件的关系: props down, events up
父组件通过prop把属性传递给子组件;子组件通过触发事件,把数据传递给父组件
https://vuejs.org/v2/guide/co...
使用props传递数据在子组件的js声明中,添加props(和data同级),props才能从父组件传递到子组件。
同时,需要在父组件标签中添加这个属性,该属性才能传递到子组件内。
html标签内不区分大小写,所以使用连接横杠-,js的props内使用驼峰式命名法(首字母小写)
动态属性通过v-bind:子组件数据名称=父组件数据名称
也可以v-bind=对象名
todo: { text: "Learn Vue", isComplete: false }标签中的属性字面量与v-bind:xxx的动态变量等同于
直接使用属性,是字面量;v-bind:xx是表达式。
因此,直接使用属性,数据类型都是字符串;v-bind的在经过表达式运算之后,可以是数字类型(等等)
父组件的数据通过props传递给子组件,子组件通过computed或data来进行数据处理。
不要在子组件直接改变父组件的数据。
把父组件传递的数据当做子组件的初始值。
js中的对象和数组传递的是引用值,子组件如果修改,会影响父组件
可以在子组件的js内,定义父组件需要传递给子组件的props名称、类型、是否必须等
无prop的属性https://vuejs.org/v2/guide/co...
(子组件的js内)未定义某个prop,父组件直接在标签上传入某个prop
通常被用在class、style上
https://vuejs.org/v2/guide/co...
$on/$emit和浏览器原生的
EventTarget API
没有关系
在父组件的上下文环境中,使用v-on来监听子组件触发($emit)的事件
使用.native修饰符去监听原生事件 使用.sync修饰符Vue.component("button-counter", { template: "", data: function () { return { counter: 0 } }, methods: { incrementCounter: function () { this.counter += 1 this.$emit("increment") } }, }) new Vue({ el: "#counter-event-example", data: { total: 0 }, methods: { incrementTotal: function () { this.total += 1 } } }){{ total }}
实质为: bar = val">
在子组件的js内,需要触发update:foo事件来更新foo的值
this.$emit("update:foo", newValue)表单输入与自定义事件
https://vuejs.org/v2/guide/co...
实质为:
如果想让自定义组件与v-model协作,自定义组件需要:
accept a value prop
触发 input 事件,并传入新值
自定义组件的v-model在js中添加model字段
Vue.component("my-checkbox", { model: { prop: "checked", event: "change" }, props: { checked: Boolean, // this allows using the `value` prop for a different purpose value: String }, // ... })非父子组件之间的通信以上等同于: { foo = val }" value="some value">
使用一个中间Vue实例来传递消息,或使用Vuex.
var bus = new Vue() // in component A"s method bus.$emit("id-selected", 1) // in component B"s created hook bus.$on("id-selected", function (id) { // ... })内容分发与slot
https://vuejs.org/v2/guide/co...
单slot用实际使用某个组件时写入到组件标签内的内容,
去替换组件原有的模板中的slot的内容.
(然后再将组件内的所有内容合并到父级元素内)
如果实际使用组件时,组件标签内没有内容,
则显示组件原有的模板中的slot内容.
(然后再将组件内的所有内容合并到父级元素内)
动态组件content at parent content at parent"s footer slot
h2 inside p (wrong!!!)
https://vuejs.org/v2/guide/co...
var vm = new Vue({ el: "#example", data: { currentView: "home" }, components: { home: { /* ... */ }, posts: { /* ... */ }, archive: { /* ... */ } } })keep-aliveIf you prefer, you can also bind directly to component objects: var Home = { template: " Welcome home!
" } var vm = new Vue({ el: "#example", data: { currentView: Home } })
杂项
https://vuejs.org/v2/guide/co...
编写可复用组件Props/Events/Slots 结合使用
引用子组件直接用js访问子组件.
需要在使用子组件时,标签内添加ref="xxx"
var parent = new Vue({ el: "#parent" }) // 访问子组件实例 var child = parent.$refs.profile异步组件
结合webpack的import()
高级异步组件const AsyncComp = () => ({ // The component to load. Should be a Promise component: import("./MyComp.vue"), // A component to use while the async component is loading loading: LoadingComp, // A component to use if the load fails error: ErrorComp, // Delay before showing the loading component. Default: 200ms. delay: 200, // The error component will be displayed if a timeout is // provided and exceeded. Default: Infinity. timeout: 3000 })组件命名约定
(使用JS)声明组件时, PascalCase,
(标签内)使用组件时,
https://vuejs.org/v2/guide/co...
组件之间的相互引用添加beforeCreate 函数
beforeCreate: function () { this.$options.components.TreeFolderContents = require("./tree-folder-contents.vue") }内联模板
模板的标签内添加inline-template
X-TemplatesVue.component("hello-world", { template: "#hello-world-template" })v-once
很长很长的,只渲染一次的内容,比如,用户协议.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/90670.html
摘要:屌丝和女神约好一起喝咖啡,聊天很愉快,分开不久手机收到女神发来的一个信息西女一个西女,你的嘴巴和手好白,你的嘴巴和手好白,你的嘴巴和手好白。屌丝看到了这句话顿时懵逼了。其实如果没有编辑器,你就相当于女神,电脑就相当于屌丝,他看不懂你写的。 javascript,当今最流行的开发语言之一,既有它简单易学的一面,又有它不同于其它语言奇怪的一面。我们一起通过感受javascript之美这套课...
摘要:前言去年十月开始学习一开始写了一个的爬虫将自己在过程中的一些经验写了下来没想到那么多人支持。但目前也只是处于能用状态。及如何将一个文件夹下文件变成一个包呢。而不仅仅是一个服务器无法理解此请求。 前言 去年十月开始学习python一开始写了一个python的爬虫 将自己在过程中的一些经验写了下来没想到那么多人支 持。之后因为一些实验室的需求就转投python的web开发 一开...
1、什么是建造者模式Separate the construction of a complex object from its representation so that the same construction process can create different representations.将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。 说人话:将构...
摘要:建造者模式实现建造者模式实现创建抽象建造者类创建具体建造者类。建造者模式使用场景建造者模式使用场景相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...
阅读 2128·2023-04-25 20:45
阅读 1033·2021-09-22 15:13
阅读 3617·2021-09-04 16:48
阅读 2565·2019-08-30 15:53
阅读 908·2019-08-30 15:44
阅读 879·2019-08-30 15:43
阅读 972·2019-08-29 16:33
阅读 3416·2019-08-29 13:08