vue 语法

vue

模板语法

<!-- 文本 使用 {{...}} -->

<div >

<p>{{ message }}</p>

</div>

<!-- 使用 v-html 指令用于输出 html 代码: -->

<div >

<div v-html="message"></div>

</div>

<!-- HTML 属性中的值应使用 v-bind 指令 -->

<div >

<div v-bind:class="{'class1': use}">

v-bind:class 指令

</div>

</div>

<!-- Vue.js 都提供了完全的 JavaScript 表达式支持。 -->

<div >

{{5+5}}<br>

{{ ok ? 'YES' : 'NO' }}<br>

{{ message.split('').reverse().join('') }}

<div v-bind:>菜鸟教程</div>

</div>

<!-- 指令是带有 v- 前缀的特殊属性。 v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。 -->

<div >

<p v-if="seen">现在你看到我了</p>

</div>

<!-- 参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性: -->

<div >

<pre><a v-bind:href="url">菜鸟教程</a></pre>

</div>

<!-- 在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定, v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。 -->

<div >

<p>{{ message }}</p>

<input v-model="message">

</div>

<!-- 使用 v-on 监听事件,并对用户的输入进行响应 -->

<div >

<p>{{ message }}</p>

<button v-on:click="reverseMessage">反转字符串</button>

</div>

<!-- Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下: -->

<!-- 在两个大括号中 -->

{{ message | capitalize }}

<!-- 在 v-bind 指令中 -->

<div v-bind:></div>

<!-- 过滤器是 JavaScript 函数,因此可以接受参数:message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。 -->

{{ message | filterA('arg1', arg2) }}

<!-- vue 缩写 -->

<!-- 完整语法 -->

<a v-bind:href="url"></a>

<!-- 缩写 -->

<a :href="url"></a>

<!-- 完整语法 -->

<a v-on:click="doSomething"></a>

<!-- 缩写 -->

<a @click="doSomething"></a>

条件语法

<!-- 条件判断使用 v-if 指令:  v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。-->

<div >

<p v-if="seen">现在你看到我了</p>

<template v-if="ok">

<h1>菜鸟教程</h1>

<p>学的不仅是技术,更是梦想!</p>

<p>哈哈哈,打字辛苦啊!!!</p>

</template>

</div>

<!-- 用 v-else 指令给 v-if 添加一个 "else" 块: -->

<div >

<div v-if="Math.random() > 0.5">

Sorry

</div>

<div v-else>

Not sorry

</div>

</div>

<!-- v-else-if 在 2.1.0 新增,顾名思义,用作 v-if 的 else-if 块。可以链式的多次使用: -->

<div >

<div v-if="type === 'A'">

A

</div>

<div v-else-if="type === 'B'">

B

</div>

<div v-else-if="type === 'C'">

C

</div>

<div v-else>

Not A/B/C

</div>

</div>

<!-- 使用 v-show 指令来根据条件展示元素: -->

<h1 v-show="ok">Hello!</h1>

循环语法

<!-- v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名。 -->

<div >

<ol>

<li v-for="site in sites">

{{ site.name }}

</li>

</ol>

</div>

<script>

new Vue({

el: '#app',

data: {

sites: [

{ name: 'Runoob' },

{ name: 'Google' },

{ name: 'Taobao' }

]

}

})

</script>

<!-- v-for 可以通过一个对象的属性来迭代数据: -->

<!-- 1 -->

<div >

<ul>

<li v-for="value in object">

{{ value }}

</li>

</ul>

</div>

<!-- 2 -->

<div >

<ul>

<li v-for="(value, key) in object">

{{ key }} : {{ value }}

</li>

</ul>

</div>

<!-- 3 -->

<div >

<ul>

<li v-for="(value, key, index) in object">

{{ index }}. {{ key }} : {{ value }}

</li>

</ul>

</div>

计算属性

<!-- 提供的函数将用作属性 vm.reversedMessage 的 getter 。vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 -->

<div >

<p>原始字符串: {{ message }}</p>

<p>计算后反转字符串: {{ reversedMessage }}</p>

</div>

<script>

var vm = new Vue({

el: '#app',

data: {

message: 'Runoob!'

},

computed: {

// 计算属性的 getter

reversedMessage: function () {

// `this` 指向 vm 实例

return this.message.split('').reverse().join('')

}

}

})

</script>

<!-- 我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。-->

methods: {

reversedMessage2: function () {

return this.message.split('').reverse().join('')

}

}

<!-- computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :-->

<script>

var vm = new Vue({

el: '#app',

data: {

name: 'Google',

url: 'http://www.google.com'

},

computed: {

site: {

// getter

get: function () {

return this.name + ' ' + this.url

},

// setter

set: function (newValue) {

var names = newValue.split(' ')

this.name = names[0]

this.url = names[names.length - 1]

}

}

}

})

// 调用 setter, vm.name 和 vm.url 也会被对应更新

vm.site = '菜鸟教程 http://www.runoob.com';

document.write('name: ' + vm.name);

document.write('<br>');

document.write('url: ' + vm.url);

</script>

监听属性

<!-- 创建了两个输入框,data 属性中, kilometers 和 meters 初始值都为 0。watch 对象创建了 data 对象的两个监控方法: kilometers 和 meters。当我们再输入框输入数据时,watch 会实时监听数据变化并改变自身的值 -->

<div id = "computed_props">

千米 : <input type = "text" v-model = "kilometers">

米 : <input type = "text" v-model = "meters">

</div>

<p ></p>

<script type = "text/javascript">

var vm = new Vue({

el: '#computed_props',

data: {

kilometers : 0,

meters:0

},

methods: {

},

computed :{

},

watch : {

kilometers:function(val) {

this.kilometers = val;

this.meters = this.kilometers * 1000

},

meters : function (val) {

this.kilometers = val/ 1000;

this.meters = val;

}

}

});

// $watch 是一个实例方法

vm.$watch('kilometers', function (newValue, oldValue) {

// 这个回调将在 vm.kilometers 改变后调用

document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue;

})

</script>

样式绑定

<!-- 可以在对象中传入更多属性用来动态切换多个 class 。-->

</head>

<body>

<div >

<div class="static"

v-bind:class="{ 'active': isActive, 'text-danger': hasError }">

</div>

</div>

<script>

new Vue({

el: '#app',

data: {

isActive: true,

hasError: true

}

})

</script>

</body>

</html>

<!-- 可以在对象中传入更多属性用来动态切换多个 class 。-->

<body>

<div >

<div v-bind:class="classObject"></div>

</div>

<script>

new Vue({

el: '#app',

data: {

classObject: {

active: true,

'text-danger': true

}

}

})

</script>

</body>

</html>

<!-- 可以把一个数组传给 v-bind:class -->

<div >

<div v-bind:class="[activeClass, errorClass]"></div>

</div>

<script>

new Vue({

el: '#app',

data: {

activeClass: 'active',

errorClass: 'text-danger'

}

})

</script>

<!-- errorClass 是始终存在的,isActive 为 true 时添加 activeClass 类: -->

<div v-bind:class="[errorClass ,isActive ? activeClass : '']"></div>

<!-- 我们可以在 v-bind:style 直接设置样式:当 v-bind:style 使用需要特定前缀的 CSS 属性时,如 transform ,Vue.js 会自动侦测并添加相应的前缀。 -->

<div >

<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">菜鸟教程</div>

</div>

事件处理器

on与js原生方法

<!-- 事件监听可以使用 v-on 指令:-->

<div >

<button v-on:click="counter += 1">增加 1</button>

<p>这个按钮被点击了 {{ counter }} 次。</p>

</div>

<!-- v-on 可以接收一个定义的方法来调用。 -->

<div >

<!-- `greet` 是在下面定义的方法名 -->

<button v-on:click="greet">Greet</button>

</div>

<script>

var app = new Vue({

el: '#app',

data: {

name: 'Vue.js'

},

// 在 `methods` 对象中定义方法

methods: {

greet: function (event) {

// `this` 在方法里指当前 Vue 实例

alert('Hello ' + this.name + '!')

// `event` 是原生 DOM 事件

if (event) {

alert(event.target.tagName)

}

}

}

})

// 也可以用 JavaScript 直接调用方法

app.greet() // -> 'Hello Vue.js!'

</script>

<!-- 除了直接绑定到一个方法,也可以用内联 JavaScript 语句:-->

<div >

<button v-on:click="say('hi')">Say hi</button>

<button v-on:click="say('what')">Say what</button>

</div>

<script>

new Vue({

el: '#app',

methods: {

say: function (message) {

alert(message)

}

}

})

</script>

DOM事件

<!-- Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation()。Vue.js 通过由点 . 表示的指令后缀来调用修饰符。 -->

<!--

.stop - 阻止冒泡

.prevent - 阻止默认事件

.capture - 阻止捕获

.self - 只监听触发该元素的事件

.once - 只触发一次

.left - 左键事件

.right - 右键事件

.middle - 中间滚轮事件

-->

<!-- 阻止单击事件冒泡 -->

<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 -->

<form v-on:submit.prevent="onSubmit"></form>

<!-- 修饰符可以串联 -->

<a v-on:click.stop.prevent="doThat"></a>

<!-- 只有修饰符 -->

<form v-on:submit.prevent></form>

<!-- 添加事件侦听器时使用事件捕获模式 -->

<div v-on:click.capture="doThis">...</div>

<!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->

<div v-on:click.self="doThat">...</div>

<!-- click 事件只能点击一次,2.1.4版本新增 -->

<a v-on:click.once="doThis"></a>

按键修饰事件

<!-- Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: -->

<!-- 只有在 keyCode 是 13 时调用 vm.submit() -->

<input v-on:keyup.13="submit">

<!--

全部的按键别名:

.enter

.tab

.delete (捕获 "删除" 和 "退格" 键)

.esc

.space

.up

.down

.left

.right

.ctrl

.alt

.shift

.meta

-->

表单

普通控件

<!-- v-model 会根据控件类型自动选取正确的方法来更新元素。-->

<div >

<p>input 元素:</p>

<input v-model="message" placeholder="编辑我……">

<p>消息是: {{ message }}</p>

<p>textarea 元素:</p>

<p style="white-space: pre">{{ message2 }}</p>

<textarea v-model="message2" placeholder="多行文本输入……"></textarea>

</div>

复选框

<!-- 复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:-->

<div >

<p>单个复选框:</p>

<input type="checkbox" >

<label for="checkbox">{{ checked }}</label>

<p>多个复选框:</p>

<input type="checkbox" >

<label for="runoob">Runoob</label>

<input type="checkbox" >

<label for="google">Google</label>

<input type="checkbox" >

<label for="taobao">taobao</label>

<br>

<span>选择的值为: {{ checkedNames }}</span>

</div>

<script>

new Vue({

el: '#app',

data: {

checked : false,

checkedNames: []

}

})

</script>

单选按钮

<div >

<input type="radio" >

<label for="runoob">Runoob</label>

<br>

<input type="radio" >

<label for="google">Google</label>

<br>

<span>选中值为: {{ picked }}</span>

</div>

<script>

new Vue({

el: '#app',

data: {

picked : 'Runoob'

}

})

</script>

下拉列表

<div >

<select v-model="selected" name="fruit">

<option value="">选择一个网站</option>

<option value="www.runoob.com">Runoob</option>

<option value="www.google.com">Google</option>

</select>

<div >

选择的网站是: {{selected}}

</div>

</div>

<script>

new Vue({

el: '#app',

data: {

selected: ''

}

})

</script>

其他修饰符

<!-- 在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:-->

<!-- 在 "change" 而不是 "input" 事件中更新 -->

<input v-model.lazy="msg" >

<!-- 如果想自动将用户的输入值转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个修饰符 number 给 v-model 来处理输入值:-->

<input v-model.number="age" type="number">

<!-- 如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入:-->

<input v-model.trim="msg">

组件

全局组件

<!-- Vue.component(tagName, options),tagName 为组件名,options 为配置选项 -->

<div >

<runoob></runoob>

</div>

<script>

// 注册

Vue.component('runoob', {

template: '<h1>自定义组件!</h1>'

})

// 创建根实例

new Vue({

el: '#app'

})

</script>

局部组件

<div >

<runoob></runoob>

</div>

<script>

var Child = {

template: '<h1>自定义组件!</h1>'

}

// 创建根实例

new Vue({

el: '#app',

components: {

// <runoob> 将只在父模板可用

'runoob': Child

}

})

</script>

Prop

<!-- prop 是子组件用来接受父组件传递过来的数据的一个自定义属性。父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop" -->

<div >

<child message="hello!"></child>

</div>

<script>

// 注册

Vue.component('child', {

// 声明 props

props: ['message'],

// 同样也可以在 vm 实例中像 "this.message" 这样使用

template: '<span>{{ message }}</span>'

})

// 创建根实例

new Vue({

el: '#app'

})

</script>

动态Prop

<!-- 类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:-->

<!-- 注意: prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。-->

<div >

<div>

<input v-model="parentMsg">

<br>

<child v-bind:message="parentMsg"></child>

</div>

</div>

<script>

// 注册

Vue.component('child', {

// 声明 props

props: ['message'],

// 同样也可以在 vm 实例中像 "this.message" 这样使用

template: '<span>{{ message }}</span>'

})

// 创建根实例

new Vue({

el: '#app',

data: {

parentMsg: '父组件内容'

}

})

</script>

<!-- 使用 v-bind 指令将 todo 传到每一个重复的组件中 -->

<div >

<ol>

<todo-item v-for="item in sites" v-bind:todo="item"></todo-item>

</ol>

</div>

<script>

Vue.component('todo-item', {

props: ['todo'],

template: '<li>{{ todo.text }}</li>'

})

new Vue({

el: '#app',

data: {

sites: [

{ text: 'Runoob' },

{ text: 'Google' },

{ text: 'Taobao' }

]

}

})

</script>

Prop验证

<script>

<!-- 为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组 -->

Vue.component('my-component', {

props: {

// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)

propA: Number,

// 多个可能的类型

propB: [String, Number],

// 必填的字符串

propC: {

type: String,

required: true

},

// 带有默认值的数字

propD: {

type: Number,

default: 100

},

// 带有默认值的对象

propE: {

type: Object,

// 对象或数组默认值必须从一个工厂函数获取

default: function () {

return { message: 'hello' }

}

},

// 自定义验证函数

propF: {

validator: function (value) {

// 这个值必须匹配下列字符串中的一个

return ['success', 'warning', 'danger'].indexOf(value) !== -1

}

}

}

})

<!-- 当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。-->

<!--

type 可以是下面原生构造器

String

Number

Boolean

Array

Object

Date

Function

Symbol

-->

</script>

自定义事件

  • 父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件。可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface)。

    • 使用 $on(eventName) 监听事件
    • 使用 $emit(eventName) 触发事件

  • 另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。

<div >

<div >

<p>{{ total }}</p>

<button-counter v-on:increment="incrementTotal"></button-counter>

<button-counter v-on:increment="incrementTotal"></button-counter>

</div>

</div>

<script>

Vue.component('button-counter', {

template: '<button v-on:click="incrementHandler">{{ counter }}</button>',

data: function () {

return {

counter: 0

}

},

methods: {

incrementHandler: function () {

this.counter += 1

this.$emit('increment')

}

},

})

new Vue({

el: '#counter-event-example',

data: {

total: 0

},

methods: {

incrementTotal: function () {

this.total += 1

}

}

})

</script>

<!-- 如果你想在某个组件的根元素上监听一个原生事件。可以使用 .native 修饰 v-on 。例如:-->

<my-component v-on:click.native="doTheThing"></my-component>

data必须是函数

<!-- 这样的好处就是每个实例可以维护一份被返回对象的独立的拷贝,如果 data 是一个对象则会影响到其他实例 -->

<div >

<button-counter2></button-counter2>

<button-counter2></button-counter2>

<button-counter2></button-counter2>

</div>

<script>

var buttonCounter2Data = {

count: 0

}

Vue.component('button-counter2', {

/*

data: function () {

// data 选项是一个函数,组件不相互影响

return {

count: 0

}

},

*/

data: function () {

// data 选项是一个对象,会影响到其他实例

return buttonCounter2Data

},

template: '<button v-on:click="count++">点击了 {{ count }} 次。</button>'

})

new Vue({ el: '#components-demo3' })

</script>

自定义组件 v-model

<!-- 组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件。-->

<input v-model="parentData">

<!-- 等价于 -->

<input

:value="parentData"

@input="parentData = $event.target.value"

>

<!-- 以下实例自定义组件 runoob-input,父组件的 num 的初始值是 100,更改子组件的值能实时更新父组件的 num: -->

<div >

<runoob-input v-model="num"></runoob-input>

<p>输入的数字为:{{num}}</p>

</div>

<script>

Vue.component('runoob-input', {

template: `

<p> <!-- 包含了名为 input 的事件 -->

<input

ref="input"

:value="value"

@input="$emit('input', $event.target.value)"

>

</p>

`,

props: ['value'], // 名为 value 的 prop

})

new Vue({

el: '#app',

data: {

num: 100,

}

})

</script>

<!-- 由于 v-model 默认传的是 value,不是 checked,所以对于复选框或者单选框的组件时,我们需要使用 model 选项,model 选项可以指定当前的事件类型和传入的 props。-->

<div >

<base-checkbox v-model="lovingVue"></base-checkbox>

<div v-show="lovingVue">

如果选择框打勾我就会显示。

</div>

</div>

<script>

// 注册

Vue.component('base-checkbox', {

model: {

prop: 'checked',

event: 'change' // onchange 事件

},

props: {

checked: Boolean

},

template: `

<input

type="checkbox"

v-bind:checked="checked"

v-on:change="$emit('change', $event.target.checked)"

>

`

})

// 创建根实例

new Vue({

el: '#app',

data: {

lovingVue: true

}

})

</script>

自定义指令

注册指令

<!-- 注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: -->

<div >

<p>页面载入时,input 元素自动获取焦点:</p>

<input v-focus>

</div>

<script>

// 注册一个全局自定义指令 v-focus

Vue.directive('focus', {

// 当绑定元素插入到 DOM 中。

inserted: function (el) {

// 聚焦元素

el.focus()

}

})

// 创建根实例

new Vue({

el: '#app'

})

</script>

<!-- 也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: -->

<div >

<p>页面载入时,input 元素自动获取焦点:</p>

<input v-focus>

</div>

<script>

// 创建根实例

new Vue({

el: '#app',

directives: {

// 注册一个局部的自定义指令 v-focus

focus: {

// 指令的定义

inserted: function (el) {

// 聚焦元素

el.focus()

}

}

}

})

</script>

钩子函数

  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

钩子函数参数

  • el: 指令所绑定的元素,可以用来直接操作 DOM 。

  • binding: 一个对象,包含以下属性:

    • name: 指令名,不包括 v- 前缀。

    • value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2。

    • oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。

    • expression: 绑定值的表达式或变量名。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。

    • arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。

    • modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。

  • vnode: Vue 编译生成的虚拟节点。

  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

<div >

</div>

<script>

Vue.directive('runoob', {

bind: function (el, binding, vnode) {

var s = JSON.stringify

el.innerHTML =

'name: ' + s(binding.name) + '<br>' +

'value: ' + s(binding.value) + '<br>' +

'expression: ' + s(binding.expression) + '<br>' +

'argument: ' + s(binding.arg) + '<br>' +

'modifiers: ' + s(binding.modifiers) + '<br>' +

'vnode keys: ' + Object.keys(vnode).join(', ')

}

})

new Vue({

el: '#app',

data: {

message: '菜鸟教程!'

}

})

</script>

路由

<div >

<h1>Hello App!</h1>

<p>

<!-- 使用 router-link 组件来导航. -->

<!-- 通过传入 `to` 属性指定链接. -->

<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->

<router-link to="/foo">Go to Foo</router-link>

<router-link to="/bar">Go to Bar</router-link>

</p>

<!-- 路由出口 -->

<!-- 路由匹配到的组件将渲染在这里 -->

<router-view></router-view>

</div>

<script>

// 0. 如果使用模块化机制编程,导入 Vue 和 VueRouter,要调用 Vue.use(VueRouter)

// 1. 定义(路由)组件。

// 可以从其他文件 import 进来

const Foo = { template: '<div>foo</div>' }

const Bar = { template: '<div>bar</div>' }

// 2. 定义路由

// 每个路由应该映射一个组件。 其中"component" 可以是

// 通过 Vue.extend() 创建的组件构造器,

// 或者,只是一个组件配置对象。

// 我们晚点再讨论嵌套路由。

const routes = [

{ path: '/foo', component: Foo },

{ path: '/bar', component: Bar }

]

// 3. 创建 router 实例,然后传 `routes` 配置

// 你还可以传别的配置参数, 不过先这么简单着吧。

const router = new VueRouter({

routes // (缩写)相当于 routes: routes

})

// 4. 创建和挂载根实例。

// 记得要通过 router 配置参数注入路由,

// 从而让整个应用都有路由功能

const app = new Vue({

router

}).$mount('#app')

// 现在,应用已经启动了

</script>

route-link: to

  • 表示目标路由的链接。 当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象。

<!-- 字符串 -->

<router-link to="home">Home</router-link>

<!-- 渲染结果 -->

<a href="home">Home</a>

<!-- 使用 v-bind 的 JS 表达式 -->

<router-link v-bind:to="'home'">Home</router-link>

<!-- 不写 v-bind 也可以,就像绑定别的属性一样 -->

<router-link :to="'home'">Home</router-link>

<!-- 同上 -->

<router-link :to="{ path: 'home' }">Home</router-link>

<!-- 命名的路由 -->

<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

<!-- 带查询参数,下面的结果为 /register?plan=private -->

<router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>

route-link: replace

  • 设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),导航后不会留下 history 记录。

<router-link :to="{ path: '/abc'}" replace></router-link>

route-link: append

  • 设置 append 属性后,则在当前 (相对) 路径前添加其路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b

<router-link :to="{ path: 'relative/path'}" append></router-link>

route-link: tag

  • 有时候想要 渲染成某种标签,例如

  • 。 于是我们使用 tag prop 类指定何种标签,同样它还是会监听点击,触发导航。

<router-link to="/foo" tag="li">foo</router-link>

<!-- 渲染结果 -->

<li>foo</li>

route-link: active-class

  • 设置 链接激活时使用的 CSS 类名。可以通过以下代码来替代。

<style>

._active{

background-color : red;

}

</style>

<p>

<router-link v-bind:to = "{ path: '/route1'}" active-class = "_active">Router Link 1</router-link>

<router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>

</p>

route-link: exact-active-class

  • 配置当链接被精确匹配的时候应该激活的 class。可以通过以下代码来替代。

<p>

<router-link v-bind:to = "{ path: '/route1'}" exact-active-class = "_active">Router Link 1</router-link>

<router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>

</p>

route-link: event

  • 声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组。

<router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>

混入

  • 混入 (mixins)定义了一部分可复用的方法或者计算属性。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。

选项合并

  • 当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。比如,数据对象在内部会进行浅合并 (一层属性深度),在和组件的数据发生冲突时以组件数据优先。

<script>

var mixin = {

created: function () {

document.write('混入调用' + '<br>')

}

}

new Vue({

mixins: [mixin],

created: function () {

document.write('组件调用' + '<br>')

}

});

</script>

<!--

混入调用

组件调用

-->

<script>

var mixin = {

methods: {

hellworld: function () {

document.write('HelloWorld 方法' + '<br>');

},

samemethod: function () {

document.write('Mixin:相同方法名' + '<br>');

}

}

};

var vm = new Vue({

mixins: [mixin],

methods: {

start: function () {

document.write('start 方法' + '<br>');

},

samemethod: function () {

document.write('Main:相同方法名' + '<br>');

}

}

});

vm.hellworld();

vm.start();

vm.samemethod();

</script>

<!--

HelloWorld 方法

start 方法

Main:相同方法名

-->

全局混入

<script>

// 为自定义的选项 'myOption' 注入一个处理器。

Vue.mixin({

created: function () {

var myOption = this.$options.myOption

if (myOption) {

console.log(myOption)

}

}

})

new Vue({

myOption: 'hello!'

})

// => "hello!"

// 谨慎使用全局混入对象,因为会影响到每个单独创建的 Vue 实例 (包括第三方模板)。

</script>

响应接口

watch

  • 通过使用 \(watch 属性来实现数据的监听,\)watch 必须添加在 Vue 实例之外才能实现正确的响应。

<div id = "app">

<p style = "font-size:25px;">计数器: {{ counter }}</p>

<button @click = "counter++" style = "font-size:25px;">点我</button>

</div>

<script type = "text/javascript">

var vm = new Vue({

el: '#app',

data: {

counter: 1

}

});

vm.$watch('counter', function(nval, oval) {

alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');

});

setTimeout(

function(){

vm.counter += 20;

},10000

);

</script>

Vue.set

  • Vue.set 方法用于设置对象的属性,它可以解决 Vue 无法检测添加属性的限制,Vue.set( target, key, value)。
  • 直接赋值,没有get和set方法,但使用Vue.set就可以拥有。

<div id = "app">

<p style = "font-size:25px;">计数器: {{ products.id }}</p>

<button @click = "products.id++" style = "font-size:25px;">点我</button>

</div>

<script type = "text/javascript">

var myproduct = {"id":1, name:"book", "price":"20.00"};

var vm = new Vue({

el: '#app',

data: {

products: myproduct

}

});

Vue.set(myproduct, 'qty', 1);

console.log(vm);

vm.$watch('products.id', function(nval, oval) {

alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');

});

</script>

Vue.delete

  • Vue.delete 用于删除动态添加的属性,Vue.delete( target, key)。

<div id = "app">

<p style = "font-size:25px;">计数器: {{ products.id }}</p>

<button @click = "products.id++" style = "font-size:25px;">点我</button>

</div>

<script type = "text/javascript">

var myproduct = {"id":1, name:"book", "price":"20.00"};

var vm = new Vue({

el: '#app',

data: {

products: myproduct

}

});

Vue.delete(myproduct, 'price');

console.log(vm);

vm.$watch('products.id', function(nval, oval) {

alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');

});

</script>

ajax

  • https://www.runoob.com/vue2/vuejs-ajax-axios.html
  • https://www.runoob.com/vue2/vuejs-ajax.html

以上是 vue 语法 的全部内容, 来源链接: utcz.com/z/377566.html

回到顶部