亢Vue.js
var vm=new Vue({})
<script src="./vue.min.js">
构建用户界面的框架
var app=new Vue({el:"#app",data:{msg:"hello vue!"}})
<div id="#app">{{msg}}</div>
在标签内定义动态变量
<div id="app-2"> <span v-bind:title="message"> 鼠标悬停几秒钟查看此处动态绑定的提示信息! </span></div>这里意思就是把span添加title="$message"属性,内容是vue内的message的变量值
<p v-if="flag">根据变量是否显示
在data定义对象在HTML中调用
在控制台里,输入 app4.todos.push({ text: '新项目' }),你会发现列表最后添加了一个新项目。往对象插入新值的方法obj.push({id:999})
v-on:click="ap"//ap是vue内的函数
主要用在form元素中v-model:msg
有全局组件和局部组件
· Vue.component('login'.{templage:'登录组件'})
全局组件
Vue.component('todo-item', { // todo-item 组件现在接受一个 // "prop",类似于一个自定义特性。 // 这个 prop 名为 todo。 props: ['todo'], template: '<li>{{ todo.text }}</li>'})之所以定义props是因为要从vm对象中取值todo对象来使用
· components:{ 'login':{templage:'登录组件'} }
在vm中定义局部组件
<login></login>
这里不是太懂
这里记录一下.组件之间可以传值,传递变量:在Vue.component中组件名字定义log增加props定义数组定义一个新变量fusite,然后在log的HTML标签增加<log :fusite='site'>,然后在log的模版中就可以访问{{fusite的变量}},其实就是间接访问父组件的site属性啦.传递方法:在Vue.component中组件名字定义log增加methods方法funcbut(在子组件模版中方便其他应用调用此方法),然后引用funcfuncbut:function(){ this.$emit('func') },引用之后在log标签html中<log @func='details'>就成功引用了,在log的模版中调用方法就直接调用funcbut就可以了,这里有点绕,注意区分funcbut和func和details的方法区别.funcbut是在log中定义的方法,用来引用log标签$emit引用func的.可以在log的模版中调用这个方法func是在loghtml标签用来引用父组件details函数的一个临时名称details是父组件的方法名称.<body> <div id="vue_det"> <h1>site : {{site}}</h1> <input type="text" name="" v-model='site' id=""> <p v-html="url" @func="details">1212</p> <!-- <login></login> --> <hr> <log :fusite='site' @func='details'></log> <!-- <router-view></router-view> --> </div> <template id="tmp1"> <div> <h3>我是一个h3标签,是log组件,想要调用父vue的属性怎么办呢?</h3> <p>首先在log组件填写props属性,然后在loghtml的里面进行传值</p> <p>父组件site值:{{fusite}}</p> <input type="text" name="" v-model='fusite' id=""> <input type="button" id="button" value="弹窗" @click='funcbut'> <!-- 简单的来说组件传递,变量用v-bind,传递函数用v-on --> </div> </template> <script type="text/javascript"> //定义路由的组件对象 var login = { template: "#tmp1" } Vue.component('log',{ props:['fusite'], template:"#tmp1", methods:{ funcbut:function(){ this.$emit('func') } } }) // //定义注册路由 // var routeobj = new VueRouter({ // routes: [ // //这里是数组匹配路由规则 // { // path: "/login", // component: login // } // ] // }) var vm = new Vue({ el: '#vue_det', data: { site: "daoxiang45645454", url: "<h1>www.runoob.com</h1>", alexa: "10000" }, methods: { details: function () { alert(this.site + " - 学的不仅是技术,更是梦想!"); } }, beforeCreate() { }, //route: routeobj, }) //vm.site="45454545"; console.log(vm); </script>
· 先在自定义组件中添加props属性
props:[todo]//这里的todo(子组件引用的新变量)对应标签上的v-bind:名=父组件变量名
var vm=new Vue({})
当一个vue实例被创建时候,它将data对象中的所有的属性都加入到vue的响应式系统中.当这些属性的值发生改变时,视图将会产生响应,即匹配更新为新的值.vue的设计就相当于替代jquery.让程序员只关心数据,不再关心过程是怎样操作dom的
{{msg}}输入纯str
<p v-html='rawhtml'>填入变量包含html
{{3+3}}输出6或v-bind:id="'list'+id"这里id是变量
<p v-if="flag">为true可见</p>
<a @click.prevent='sb'>//sb是函数
v-on是@----v-bind是:
和methods同级的computed对象属性
var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar' }, computed: { fullName: function () { return this.firstName + ' ' + this.lastName } }})这里当firstname更新的时候,fullname也会被重新计算复制.
· 计算属性computed里面的元素有get和set属性
当get或set值时触发的操作
computed: { fullName: { // getter get: function () { return this.firstName + ' ' + this.lastName }, // setter set: function (newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } }}
和methods同级的watch对象属性
var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar', fullName: 'Foo Bar' }, watch: { firstName: function (val) { this.fullName = val + ' ' + this.lastName }, lastName: function (val) { this.fullName = this.firstName + ' ' + val } }})用watch侦听firstName属性,当发生改变就更新fullname的值
用v-bind:class/style来进行操作
<div v-bind:class="XX"></div>
· 对象语法
{active:isActive}//isActive是变量判断是否添加active
· 数组语法
[activeClass, errorClass]//两个变量对应class名
· 用在组件上
<login>上的class将添加在组件模版的div上
<div v-bind:style="{ color: activeColor变量}">
· 对象语法
{ color: activeColor}
· 数组语法
[baseStyles, overridingStyles]//保存两个对象
判断变量是否显示
判断变量决定是否显示
v-else-if语句
Vue 为你提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的 key 属性即可:<template v-if="loginType === 'username'"> <label>Username</label> <input placeholder="Enter your username" key="username-input"></template><template v-else> <label>Email</label> <input placeholder="Enter your email address" key="email-input"></template>
<h1 v-show="ok">Hello!</h1>
v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
不推荐.v-for比v-if优先级更高
data内有对象items=[{11}{22}{33}]
<li v-for="item in items">{{item.id}}</li>
<li v-for=(item.index) in items>{{item.id}}--{{index}}</li>
下面循环对象第二参数是key.第三参数是索引.第一参数默认是value
obj={id:1.name:daoxiang}
注意当时对象的时候如果不是二位对象,后面就没有item.id什么了.因为直接循环出来了.
· <li v-for="item in obj">{{item}}
只有一个item直接就是每项value值
· <li v-for="(item.key) in obj">{{item}}
第一个item是每项value值.key对应属性名
· <li v-for="(item.key.index) in obj">{{item}}
第一个item是每项value值.key对应属性名index是索引
<div v-for="item in items" v-bind:key="item.id">
用来操作数组的方法
· 变异方法
主要对数组的添加删除排序等操作
Vue 将被侦听的数组的变异方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:push()pop()shift()unshift()splice()sort()reverse()你可以打开控制台,然后对前面例子的 items 数组尝试调用变异方法。比如 example1.items.push({ message: 'Baz' })
· 替换数组
操作方法返回新数组
变异方法,顾名思义,会改变调用了这些方法的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如 filter()、concat() 和 slice() 。它们不会改变原始数组,而总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:example1.items = example1.items.filter(function (item) { return item.message.match(/Foo/)})你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的启发式方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。
· 注意事项
vm.items[1] = 'x' // 不是响应性的
由于 JavaScript 的限制,Vue 不能检测以下数组的变动:当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue当你修改数组的长度时,例如:vm.items.length = newLength举个例子:var vm = new Vue({ data: { items: ['a', 'b', 'c'] }})vm.items[1] = 'x' // 不是响应性的vm.items.length = 2 // 不是响应性的为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将在响应式系统内触发状态更新:// Vue.setVue.set(vm.items, indexOfItem, newValue)// Array.prototype.splicevm.items.splice(indexOfItem, 1, newValue)你也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:vm.$set(vm.items, indexOfItem, newValue)为了解决第二类问题,你可以使用 splice:vm.items.splice(newLength)
· 添加修改对象值
• 以前vm.b = 2
这种不是响应式的
• Vue.set(vm.userProfile. 'age'. 27)
vue响应式的方法一
• vm.$set(vm.userProfile. 'age'. 27)
vue响应式的方法二
· 添加修改对象多个值
有时你可能需要为已有对象赋值多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:Object.assign(vm.userProfile, { age: 27, favoriteColor: 'Vue Green'})你应该这样做:vm.userProfile = Object.assign({}, vm.userProfile, { age: 27, favoriteColor: 'Vue Green'})
· 可以使用计算属性
想要显示一个数组经过过滤或排序后的版本,而不实际改变或重置原始数据data: { numbers: [ 1, 2, 3, 4, 5 ]},computed: { evenNumbers: function () { return this.numbers.filter(function (number) { return number % 2 === 0 }) }}
v-for='n in 10'循环1-10
类似于 v-if,你也可以利用带有 v-for 的 <template> 来循环渲染一段包含多个元素的内容。比如:<ul> <template v-for="item in items"> <li>{{ item.msg }}</li> <li class="divider" role="presentation"></li> </template></ul>
当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你只想为部分项渲染节点时,这种优先级的机制会十分有用,如下:<li v-for="todo in todos" v-if="!todo.isComplete"> {{ todo }}</li>上面的代码将只渲染未完成的 todo。原理是v-for优先级高,所以先循环v-for,然后判断v-if变量是否有值,有值就显示
<my-component v-for="item in items" :key="item.id"></my-component>
· 先引用v-for语句
<my-component v-for="item in items" :key="item.id"></my-component>
· 此时虽然引用v-for因为作用域不同还需要进行传值
在组件用:item='item' :key='item.id'传递上面的item循环单项值
v-on:之后的事件以及修饰符
v-on监听dom点击覆盖等等
· v-on:click="count++"
count变量点击加1
· v-on:click="func('hi')"
func有括号表示有参数
v-on:click.修饰符
· @click.stop
阻止单击事件冒泡传播
· @click.prevent
阻止默认行为不再重载页面
· @click.stop.prevent
时间修饰符可以串联使用
· @click.self
单击自身才触发.内部元素不算
· @click.once
只能点击一次
v-on:keyup.修饰符
· @keyup.enter='xx'
按下enter触发函数
· @keyup.page-down='xx'
按下下一页触发函数
· @keyup.其他常用的按键名
enter/tab/delete/esc/space/up/down/left/right/ctrl/alt/shift
· 全局配置config.keyCodes键码别名
Vue.config.keyCodes.f1 = 112
· @click.ctrl.exact(2.5版本可用)
仅仅ctrl可用/组合件不可用
v-model在表单中的应用
应用在input/textarea/select等form元素
注意如果使用了v-model,表单将会忽略所有表单内的value,checked,selected特性的初始值,将v-model的数据作为表单的初始值.
v-model.number
· v-model.lazy=msg
在input输入不及时更新.切换下行才更新
· v-model.number='age'
在input输入的数据转换成数值
· v-model.trim='msg'
自动过滤数据两边的空格
父内定义components或者Vue.component
// 定义一个名为 button-counter 的新组件Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'})
可以复用但是没有el元素
· data必须是一个函数最后return对象数据
vue实例data是一个对象
· 组件树
每个组件又包含其他的小组件
父组件向子组件传递数据
· 假设父组件有site:'helloword'我要用
· 先定义全局组件
Vue.component('blog-post'.{
· 再定义props数组定义子变量
props: ['title']//这里title是临时变量仅可以在模版调用
· 在blog-post组件内模版调用title使用
template: '<h3>{{ title }}</h3>'
· 最后要<blog-post :title='site'>绑定父组件属性
建立实例和组件的联系上面才有效
· 如果父组件site是一个对象或数组上面还需要v-for循环上面也要改
<blog-post v-for='post in posts' :key='post.id' :titles='post.titles'
就是<log>world</log>
· 在组件模版内定义templage内容
然后最后加上<slot></slot>插槽
· html中调用标签之内有内容自动添加
<log>world</log>world会添加到slot中
<component v-bind:is="log"></component>
· 放在html中的component标签必须有is属性
· is属性对应一个变量.值就是对应模版的名字
Vue.component('name'.{ ...})
组件名大小写都可以,但是在html中引用的时候大写需要转化成-比如myName需要转换成<my-name>使用
在实例内components
this.$emit('myevent')都写成小写
v-on:focus.native="onFocus"//.native修饰符
在模版中<slot></slot>
和模版作用域一样
<navigation-link url="/profile"> Clicking here will send you to: {{ url }} <!-- 这里的 `url` 会是 undefined,因为 "/profile" 是 _传递给_ <navigation-link> 的而不是 在 <navigation-link> 组件*内部*定义的。 --></navigation-link>父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。
当组件标签之内没有内容输入这个
<slot name="header"></slot>
· 之后在模版标签中定义v-slot="header"
<template v-slot:header>
· 插槽引用变量的作用域
<slot v-bind:user="user">绑定作用域才可以用.不然只能在组件上用
· 先在组件标签上定义v-slot
<current-user v-slot:default="slotProps">
· 然后在组件内部引用变量对象
{{ slotProps.user.firstName }}
<keep-alive><log></log><keep-alive>
this.$root.foo
this.$parent.map
this.$refs.nihk
$refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs。
· $on(eventName.eventHandler)
侦听一个事件
· $once()
侦听一个事件一次
· $off()停止侦听一个事件
用script标签引用模版
另一个定义模板的方式是在一个 <script> 元素中,并为其带上 text/x-template 的类型,然后通过一个 id 将模板引用过去。例如:<script type="text/x-template" id="hello-world-template"> <p>Hello hello hello</p></script>Vue.component('hello-world', { template: '#hello-world-template'})x-template 需要定义在 Vue 所属的 DOM 元素外。
$forceUpdate
这里是一个例子点击按钮让p标签渐渐fade褪色消失1.要在什么地方动画,就在什么地方加<transition name="fade">标签2.接着在css中定义fade-enter-active等属性<div id="demo"> <button v-on:click="show = !show"> Toggle </button> <transition name="fade"> <p v-if="show">hello</p> </transition></div>new Vue({ el: '#demo', data: { show: true }}).fade-enter-active, .fade-leave-active { transition: opacity .5s;}.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ { opacity: 0;}当插入或删除包含在 transition 组件中的元素时,Vue 将会做以下处理:自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。如果过渡组件提供了 JavaScript 钩子函数,这些钩子函数将在恰当的时机被调用。如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作 (插入/删除) 在下一帧中立即执行。(注意:此指浏览器逐帧动画机制,和 Vue 的 nextTick 概念不同)
在进入/离开的过渡中,会有 6 个 class 切换。v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。我看黑马教程用的是v-enter设定属性,原来原理在这里:对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 <transition>,则 v- 是这些类名的默认前缀。如果你使用了 <transition name="my-transition">,那么 v-enter 会替换为 my-transition-enter。
在transition加上appear属性设定刚开始动画
需要将第二个按钮加上css相对位置
在div上设定position: relative;在按钮button中设定position: absolute;
即可实现元素平稳过渡
设定css和上面一样
在循环元素外加<transition-group>包裹
比如元素变大/颜色改变等特效
定义个对象使用mixin进行混入
Vue.directive('focus'.{})
定义好在标签中直接用<input v-focus>
// 注册一个全局自定义指令 `v-focus`Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() }})如果想注册局部指令,组件中也接受一个 directives 的选项:directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } }}然后你可以在模板中任何元素上使用新的 v-focus 属性,如下:<input v-focus>
一个指令定义对象可以提供如下几个钩子函数 (均为可选):bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。我们会在稍后讨论渲染函数时介绍更多 VNodes 的细节。componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。unbind:只调用一次,指令与元素解绑时调用。接下来我们来看一下钩子函数的参数 (即 el、binding、vnode 和 oldVnode)。
在全局组件定义内render:function(dom){}
在组件模版中插入h1有两种方式<h1>{{ blogTitle }}</h1>或者一个渲染函数里:render: function (createElement) { return createElement('h1', this.blogTitle)}第二个中createElement 到底会返回什么呢?其实不是一个实际的 DOM 元素。它更准确的名字可能是 createNodeDescription,因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,包括及其子节点的描述信息。我们把这样的节点描述为“虚拟节点 (virtual node)”,也常简写它为“VNode”。“虚拟 DOM”是我们对由 Vue 组件树建立起来的整个 VNode 树的称呼。
虚拟dom的方法
// @returns {VNode}createElement( // {String | Object | Function} // 一个 HTML 标签名、组件选项对象,或者 // resolve 了上述任何一种的一个 async 函数。必填项。 'div', // {Object} // 一个与模板中属性对应的数据对象。可选。 { // (详情见下一节) }, // {String | Array} // 子级虚拟节点 (VNodes),由 `createElement()` 构建而成, // 也可以使用字符串来生成“文本虚拟节点”。可选。 [ '先写一些文字', createElement('h1', '一则头条'), createElement(MyComponent, { props: { someProp: 'foobar' } }) ])
为vue添加全局功能
使用filters:定义
或者在创建 Vue 实例之前全局定义过滤器:Vue.filter('capitalize', function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1)})new Vue({ // ...})
或者<div v-bind:id="rawId | formatId"></div>
文件扩展名为 .vue 的单文件组件定义方式
这是一个单文件组件,定义hello.vue<template> <p>{{ greeting }} World!</p></template><script>module.exports = { data: function () { return { greeting: 'Hello' } }}</script><style scoped>p { font-size: 2em; text-align: center;}</style>
vue CLI???
好像在script中加export default{}
导入vue.js
导入path/to/下的mycomponent.vue组件
需要vue-route库
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。