目录
模板语法条件语法循环语法计算属性监听属性样式绑定 on与js原生方法
DOM事件
按键修饰事件
表单 普通控件
复选框
单选按钮
下拉列表
其他修饰符
组件 全局组件
局部组件
Prop
动态Prop
Prop验证
自定义事件
data必须是函数
自定义组件 v-model
自定义指令 注册指令
钩子函数
钩子函数参数
路由 route-link: to
route-link: replace
route-link: append
route-link: tag
route-link: active-class
route-link: exact-active-class
route-link: event
混入选项合并全局混入响应接口 watch
Vue.set
Vue.delete
ajax
vue 语法
模板语法
| |
| <div id="app"> |
| <p>{{ message }}</p> |
| </div> |
| |
| |
| <div id="app"> |
| <div v-html="message"></div> |
| </div> |
| |
| |
| <div id="app"> |
| <div v-bind:class="{'class1': use}"> |
| v-bind:class 指令 |
| </div> |
| </div> |
| |
| |
| <div id="app"> |
| {{5+5}}<br> |
| {{ ok ? 'YES' : 'NO' }}<br> |
| {{ message.split('').reverse().join('') }} |
| <div v-bind:id="'list-' + id">菜鸟教程</div> |
| </div> |
| |
| |
| <div id="app"> |
| <p v-if="seen">现在你看到我了</p> |
| </div> |
| |
| |
| <div id="app"> |
| <pre><a v-bind:href="url">菜鸟教程</a></pre> |
| </div> |
| |
| |
| <div id="app"> |
| <p>{{ message }}</p> |
| <input v-model="message"> |
| </div> |
| |
| |
| <div id="app"> |
| <p>{{ message }}</p> |
| <button v-on:click="reverseMessage">反转字符串</button> |
| </div> |
| |
| |
| {{ message | capitalize }} |
| |
| |
| <div v-bind:id="rawId | formatId"></div> |
| |
| |
| {{ message | filterA('arg1', arg2) }} |
| |
| |
| |
| <a v-bind:href="url"></a> |
| |
| <a :href="url"></a> |
| |
| |
| <a v-on:click="doSomething"></a> |
| |
| <a @click="doSomething"></a> |
条件语法
| |
| <div id="app"> |
| <p v-if="seen">现在你看到我了</p> |
| <template v-if="ok"> |
| <h1>菜鸟教程</h1> |
| <p>学的不仅是技术,更是梦想!</p> |
| <p>哈哈哈,打字辛苦啊!!!</p> |
| </template> |
| </div> |
| |
| |
| <div id="app"> |
| <div v-if="Math.random() > 0.5"> |
| Sorry |
| </div> |
| <div v-else> |
| Not sorry |
| </div> |
| </div> |
| |
| |
| <div id="app"> |
| <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> |
| |
| |
| <h1 v-show="ok">Hello!</h1> |
循环语法
| |
| <div id="app"> |
| <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> |
| |
| |
| |
| <div id="app"> |
| <ul> |
| <li v-for="value in object"> |
| {{ value }} |
| </li> |
| </ul> |
| </div> |
| |
| <div id="app"> |
| <ul> |
| <li v-for="(value, key) in object"> |
| {{ key }} : {{ value }} |
| </li> |
| </ul> |
| </div> |
| |
| <div id="app"> |
| <ul> |
| <li v-for="(value, key, index) in object"> |
| {{ index }}. {{ key }} : {{ value }} |
| </li> |
| </ul> |
| </div> |
计算属性
| |
| <div id="app"> |
| <p>原始字符串: {{ message }}</p> |
| <p>计算后反转字符串: {{ reversedMessage }}</p> |
| </div> |
| |
| <script> |
| var vm = new Vue({ |
| el: '#app', |
| data: { |
| message: 'Runoob!' |
| }, |
| computed: { |
| |
| reversedMessage: function () { |
| |
| return this.message.split('').reverse().join('') |
| } |
| } |
| }) |
| </script> |
| |
| |
| methods: { |
| reversedMessage2: function () { |
| return this.message.split('').reverse().join('') |
| } |
| } |
| |
| |
| <script> |
| var vm = new Vue({ |
| el: '#app', |
| data: { |
| name: 'Google', |
| url: 'http://www.google.com' |
| }, |
| computed: { |
| site: { |
| |
| get: function () { |
| return this.name + ' ' + this.url |
| }, |
| |
| set: function (newValue) { |
| var names = newValue.split(' ') |
| this.name = names[0] |
| this.url = names[names.length - 1] |
| } |
| } |
| } |
| }) |
| |
| vm.site = '菜鸟教程 http://www.runoob.com'; |
| document.write('name: ' + vm.name); |
| document.write('<br>'); |
| document.write('url: ' + vm.url); |
| </script> |
监听属性
| |
| <div id = "computed_props"> |
| 千米 : <input type = "text" v-model = "kilometers"> |
| 米 : <input type = "text" v-model = "meters"> |
| </div> |
| <p id="info"></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; |
| } |
| } |
| }); |
| |
| vm.$watch('kilometers', function (newValue, oldValue) { |
| |
| document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue; |
| }) |
| </script> |
样式绑定
| |
| </head> |
| <body> |
| <div id="app"> |
| <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> |
| |
| |
| <body> |
| <div id="app"> |
| <div v-bind:class="classObject"></div> |
| </div> |
| |
| <script> |
| new Vue({ |
| el: '#app', |
| data: { |
| classObject: { |
| active: true, |
| 'text-danger': true |
| } |
| } |
| }) |
| </script> |
| </body> |
| </html> |
| |
| |
| <div id="app"> |
| <div v-bind:class="[activeClass, errorClass]"></div> |
| </div> |
| |
| <script> |
| new Vue({ |
| el: '#app', |
| data: { |
| activeClass: 'active', |
| errorClass: 'text-danger' |
| } |
| }) |
| </script> |
| |
| |
| <div v-bind:class="[errorClass ,isActive ? activeClass : '']"></div> |
| |
| |
| <div id="app"> |
| <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">菜鸟教程</div> |
| </div> |
事件处理器
on与js原生方法
| |
| <div id="app"> |
| <button v-on:click="counter += 1">增加 1</button> |
| <p>这个按钮被点击了 {{ counter }} 次。</p> |
| </div> |
| |
| |
| <div id="app"> |
| |
| <button v-on:click="greet">Greet</button> |
| </div> |
| |
| <script> |
| var app = new Vue({ |
| el: '#app', |
| data: { |
| name: 'Vue.js' |
| }, |
| |
| methods: { |
| greet: function (event) { |
| |
| alert('Hello ' + this.name + '!') |
| |
| if (event) { |
| alert(event.target.tagName) |
| } |
| } |
| } |
| }) |
| |
| app.greet() |
| </script> |
| |
| |
| <div id="app"> |
| <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事件
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <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> |
| |
| |
| <a v-on:click.once="doThis"></a> |
按键修饰事件
| |
| |
| <input v-on:keyup.13="submit"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
表单
普通控件
| |
| <div id="app"> |
| <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 id="app"> |
| <p>单个复选框:</p> |
| <input type="checkbox" id="checkbox" v-model="checked"> |
| <label for="checkbox">{{ checked }}</label> |
| |
| <p>多个复选框:</p> |
| <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames"> |
| <label for="runoob">Runoob</label> |
| <input type="checkbox" id="google" value="Google" v-model="checkedNames"> |
| <label for="google">Google</label> |
| <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames"> |
| <label for="taobao">taobao</label> |
| <br> |
| <span>选择的值为: {{ checkedNames }}</span> |
| </div> |
| |
| <script> |
| new Vue({ |
| el: '#app', |
| data: { |
| checked : false, |
| checkedNames: [] |
| } |
| }) |
| </script> |
单选按钮
| <div id="app"> |
| <input type="radio" id="runoob" value="Runoob" v-model="picked"> |
| <label for="runoob">Runoob</label> |
| <br> |
| <input type="radio" id="google" value="Google" v-model="picked"> |
| <label for="google">Google</label> |
| <br> |
| <span>选中值为: {{ picked }}</span> |
| </div> |
| |
| <script> |
| new Vue({ |
| el: '#app', |
| data: { |
| picked : 'Runoob' |
| } |
| }) |
| </script> |
下拉列表
| <div id="app"> |
| <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 id="output"> |
| 选择的网站是: {{selected}} |
| </div> |
| </div> |
| |
| <script> |
| new Vue({ |
| el: '#app', |
| data: { |
| selected: '' |
| } |
| }) |
| </script> |
其他修饰符
| |
| |
| <input v-model.lazy="msg" > |
| |
| |
| |
| <input v-model.number="age" type="number"> |
| |
| |
| |
| <input v-model.trim="msg"> |
组件
全局组件
| |
| |
| <div id="app"> |
| <runoob></runoob> |
| </div> |
| |
| <script> |
| |
| Vue.component('runoob', { |
| template: '<h1>自定义组件!</h1>' |
| }) |
| |
| new Vue({ |
| el: '#app' |
| }) |
| </script> |
局部组件
| <div id="app"> |
| <runoob></runoob> |
| </div> |
| |
| <script> |
| var Child = { |
| template: '<h1>自定义组件!</h1>' |
| } |
| |
| |
| new Vue({ |
| el: '#app', |
| components: { |
| |
| 'runoob': Child |
| } |
| }) |
| </script> |
Prop
| |
| <div id="app"> |
| <child message="hello!"></child> |
| </div> |
| |
| <script> |
| |
| Vue.component('child', { |
| |
| props: ['message'], |
| |
| template: '<span>{{ message }}</span>' |
| }) |
| |
| new Vue({ |
| el: '#app' |
| }) |
| </script> |
动态Prop
| |
| |
| <div id="app"> |
| <div> |
| <input v-model="parentMsg"> |
| <br> |
| <child v-bind:message="parentMsg"></child> |
| </div> |
| </div> |
| |
| <script> |
| |
| Vue.component('child', { |
| |
| props: ['message'], |
| |
| template: '<span>{{ message }}</span>' |
| }) |
| |
| new Vue({ |
| el: '#app', |
| data: { |
| parentMsg: '父组件内容' |
| } |
| }) |
| </script> |
| |
| |
| <div id="app"> |
| <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: { |
| |
| 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 id="app"> |
| <div id="counter-event-example"> |
| <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> |
| |
| |
| <my-component v-on:click.native="doTheThing"></my-component> |
data必须是函数
| |
| <div id="components-demo3" class="demo"> |
| <button-counter2></button-counter2> |
| <button-counter2></button-counter2> |
| <button-counter2></button-counter2> |
| </div> |
| |
| <script> |
| var buttonCounter2Data = { |
| count: 0 |
| } |
| Vue.component('button-counter2', { |
| |
| |
| |
| |
| |
| |
| |
| |
| data: function () { |
| |
| return buttonCounter2Data |
| }, |
| template: '<button v-on:click="count++">点击了 {{ count }} 次。</button>' |
| }) |
| new Vue({ el: '#components-demo3' }) |
| </script> |
自定义组件 v-model
| |
| <input v-model="parentData"> |
| |
| <input |
| :value="parentData" |
| @input="parentData = $event.target.value" |
| > |
| |
| |
| <div id="app"> |
| <runoob-input v-model="num"></runoob-input> |
| <p>输入的数字为:{{num}}</p> |
| </div> |
| <script> |
| Vue.component('runoob-input', { |
| template: ` |
| <p> |
| <input |
| ref="input" |
| :value="value" |
| @input="$emit('input', $event.target.value)" |
| > |
| </p> |
| `, |
| props: ['value'], // 名为 value 的 prop |
| }) |
| |
| new Vue({ |
| el: '#app', |
| data: { |
| num: 100, |
| } |
| }) |
| </script> |
| |
| |
| |
| <div id="app"> |
| <base-checkbox v-model="lovingVue"></base-checkbox> |
| <div v-show="lovingVue"> |
| 如果选择框打勾我就会显示。 |
| </div> |
| </div> |
| <script> |
| |
| Vue.component('base-checkbox', { |
| |
| model: { |
| prop: 'checked', |
| event: 'change' |
| }, |
| 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> |
自定义指令
注册指令
| |
| <div id="app"> |
| <p>页面载入时,input 元素自动获取焦点:</p> |
| <input v-focus> |
| </div> |
| |
| <script> |
| |
| Vue.directive('focus', { |
| |
| inserted: function (el) { |
| |
| el.focus() |
| } |
| }) |
| |
| new Vue({ |
| el: '#app' |
| }) |
| </script> |
| |
| <div id="app"> |
| <p>页面载入时,input 元素自动获取焦点:</p> |
| <input v-focus> |
| </div> |
| |
| <script> |
| |
| new Vue({ |
| el: '#app', |
| directives: { |
| |
| 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 id="app" v-runoob:hello.a.b="message"> |
| </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 id="app"> |
| <h1>Hello App!</h1> |
| <p> |
| |
| |
| |
| <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> |
| |
| |
| |
| |
| const Foo = { template: '<div>foo</div>' } |
| const Bar = { template: '<div>bar</div>' } |
| |
| |
| |
| |
| |
| |
| const routes = [ |
| { path: '/foo', component: Foo }, |
| { path: '/bar', component: Bar } |
| ] |
| |
| |
| |
| const router = new VueRouter({ |
| routes |
| }) |
| |
| |
| |
| |
| 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> |
| |
| |
| <router-link v-bind:to="'home'">Home</router-link> |
| |
| |
| <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> |
| |
| |
| <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> |
| |
| |
| |
| |
| |
全局混入
| <script> |
| |
| Vue.mixin({ |
| created: function () { |
| var myOption = this.$options.myOption |
| if (myOption) { |
| console.log(myOption) |
| } |
| } |
| }) |
| |
| new Vue({ |
| myOption: 'hello!' |
| }) |
| |
| |
| </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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2017-10-08 POJ 3057 Evacuation (二分匹配)
2017-10-08 HDU 6118 度度熊的交易计划 (最小费用流)