Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。

 var App = new Vue({
el: "#root",
data: {
message: "asdasdasd"
}
)};
App.$weach("message",function(newVal,oldVal) {
console.log(newVal);
console.log(oldVal);
});
//es6中的箭头函数中的this并不是实例,要使用是用实例,可使用实例的对象App.message = "assassin";

模板语法

{{}}差值表达式

v-text="message" <=> {{}}
message: "<h1>asjkfjaklsfj</h1>"

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

javascript表达式

在差值里面可以书写JavaScript表达式

{{message.split('').reverse().join('')}}
//不能执行语句,都只能是单个的表达式。

修饰符

.prevent: 阻止默认事件

.stop:组织时间冒泡

过滤器

var app = new Vue({
el: "#root",
template: `<div>{{message | upperCase | lowerCase}}</div>`,//message 后面 | 过滤函数,相应的过滤函数在filter对象中定义
data: {
message: "assassin"
},
filters: {
upperCase: function(value) {
return value.toUpperCase();
},
lowerCase: function(value) {
return value.toLowerCase();
}
}
});

计算属性

把我们的数据在的处理在输出

var app = new Vue({
el: "#root",
template: `<div>{{reverseMsg}}</div>`,
data: {
message: "assassin"
},//这这里不能使用methods
computed: {//把我们的数据在的处理在输出
reverseMsg: function(value) {
return this.message.split("").reverse().join("");
}
}
});

两者之间的区别:

methods:每次dom重新渲染。

computed:dom渲染时有缓存。依据是实例内部的变量等,发生变化时,才会重新渲染。

var app = new Vue({
el: "#root",
template: `<div>
<input v-model="firstName">
<input v-model="firstName">
<div>{{fullName}}</div>
</div>`,
data: {
firstName: "",
lastName: ""
},
computed: {
lastName: function() {//挡firstName,lastName这两个内部依赖变化时,就开始重新计算,依赖不变,使用缓存。
return this.firstName + " " +this.lastName;
}
}
});

watch侦听属性

var app = new Vue({
el: "#root",
template: `<div>
<input v-model="firstName">
<input v-model="firstName">
<div>{{fullName}}</div>
</div>`,
data: {
firstName: "",
lastName: "",
fullName: ""
},
watch: {
firstName: function() {
return this.fullName = this.firstName + " " +this.lastName;
},
lastName: function() {
return this.fullName = this.first
}
}
});

相比较computed,computed的比较简洁。

computed的set属性和get属性

var app = new Vue({
el: "#root",
template: `<div>
<input v-model="firstName">
<input v-model="firstName">
<div>{{fullName}}</div>
</div>`,
data: {
firstName: "",
lastName: ""
},
computed: {
fullName: {
get: function() {
return this.firstName+" "+this.lastName;
},
set: function(value) {
var arr = value.split("");
this.firstName = arr[0];
this.lastName = arr[1];
}
}
}
});

demo:

var app = new vue({
el: "#root",
templete: `
<div id="watch-example">
<p>
Ask a yes/no question:
<input v-model="question">
</p>
<p>{{answer}}</p>
</div>
`,
data: {
question: " ",
answer: "I cannot give you an answer uniter you ask a question!"
},
watch: {
question: function() {
this.answer = "Wating for you to stop typing...";
this.getAnster();
}
},
methods: {
getAnster: function() {
if(this.question.indexOf("?") === -1) {
this.answer = "Questions usually contain a question mark.";
return ;
}
this.answer = "Thinking...";
var _this = this;
/*
axios.get("https://yesno.wtf/api").then(function(response) {
_this.answer = response.data.answer;
}).catch(function(error) {
_this.answer = "Error! Could not reach the API."+error;
});
*/
if(app.timer) {
clearTimer(app.timer);
}
app.timer = setTimeout(function() {
axios.get("https://yesno.wtf/api").then(function(response) {
_this.answer = response.data.answer;
}).catch(function(error) {
_this.answer = "Error! Could not reach the API."+error;
});
},200);//利用定时器进行优化
}
}
})

class和style

<div v-bind:class="{active: isActive}"></div>
//active 类名, isActive: 布尔值
<div v-bind:class="{active: isActive,'text-danager': hasError}"></div>
//text-danager,中间有线,所以要加单引号。
...
data: {
isActive: true
}
computed: {
hasError: function() {
return false;
}
}
//同样可以写在methods中实现,但不能重复实现过程。

上面可等价:类的对象形式

var app = new Vue({
el: "#root",
template: `<div v-bind:class="classObj">{{message}}</div>`,
data: {
message: "heelo world",
isActive: true,
hasError: false,
classObj: {
active: true,
'text-danager': false
}
},
computed: {//classObj也可以在computed中实现
classObj: function() {
return {
active: this.isActive,
'text-danger': this.hasError
}
}
}
});//case:tab

类的数组形式

var app = new Vue({
el: "#root",
template: `<div v-bind:class="[a,b]">{{message}}</div>`,
data: {
a: "active",
b: "text-danger"
},
computed: {//classObj也可以在computed中实现
classObj: function() {
return {
active: this.isActive,
'text-danger': this.hasError
}
}
}
});

内联样式:

var app = new Vue({
el: "#root",
template: `<div v-bind:style="{fontSize: fontSize + 'px'}">{{message}}</div>`,
data: {
fontSize: 30
}
});

内联样式的对象形式:

var app = new Vue({
el: "#root",
template: `<div v-bind:style="styleObj">{{message}}</div>`,
data: {
styleObj: {
color: "red",
fonSize: "30px",
display: ['-webkit-box', '-ms-flexbox', 'flex']//经过js处理在浏览器端会出现相应的属性
}
}
});

条件渲染

多条件组选择:

<template v-if="isTrue">
<div>1</div>
<div>2</div>
<div>3</div>
</template>
<template v-else="isFalse">
<div>1</div>
<div>2</div>
<div>3</div>
</template>
//在浏览器DOM中是不渲染的。
v-if="条件表达式"
<template v-if="number == 1">
<div>1</div>
<div>2</div>
<div>3</div>
</template>
<template v-else-if="number == 2">
<div>1</div>
<div>2</div>
<div>3</div>
</template>
<template v-else>
<div>1</div>
<div>2</div>
<div>3</div>
</template>
var app = new Vue({
el: "#root",
data: {
number: 1
}
})

key值管理服用的元素

<div id="root">
<template v-if="loginType === 'username'">
<label>UserName<label>
<input placeholder="Enter your name" v-model="usename">
</template>
<template v-else>
<label>Email<label>
<input placeholder="Enter your email" v-model="email">
</template>
<button v-on:click="handleClick">toggle login style</button>
</div>
var app = new Vue({
el: "#root",
data: {
loginType: "usename",
username: "",//防止输入框中的数据清除
email: ""
},
methods: {
handleClick: function() {
if(this.loginType === "username") {
this.loginType = "email";
}else{
this.loginType = "username";
}
}
}
});
//这样使得切换的input输入的值不会发生变化,vue.js中处于对渲染的优化,解决办法在不同的input中添加key值,即可区分开来。这样有个小问题,切换之后输入框中的值不存在,分别绑定model值,即可解决。

列表的渲染

v-for="(item,key) in items"
v-for="(item,key) of items"
两者用法完全相同,
<div v-for="(item, key, index) in object" v-bind:key="item.id">
{{index}}{{key}}{{value}}
</div>

在遍历对象时,是按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下是一致的。

这几种循环要谨慎使用,键值因不同的浏览器恶如输出不同的结果。循环的时候一般都要绑定key

数组的方法:

vue不会像新增内容上增加getter,setter,也就是双向绑定失效。所以对数组的操作要有新的语法。

变异方法:也就是对原有数组的方法进行了改变。

push();
pop();
shift();
unshift();
splice();
sort();
reverse();

不能直接修改等,this.items[indexOfItem] = newValue。如下:

this.items.push({ message: 'Baz' });

事件

<div id="root">
<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>
//定义局部子组件
var button = {
template: `<button v-on:click="increment">{{counter}}</button>`,
data: function() {
return {
counter: 0
}
},
methods: {
increment: function() {
this.counter += 1;
this.$emit("increment");//自己点击时触发increment事件,父组件v-on:监听并执行此事件,incrementTotal事件
}
}
}; var App = new Vue({
el: "#root",
data: {
total: 0
},
components: {//定义的子组件赋予新模板标记
"button-counter": button
},
methods: {
incrementTotal: function() {
this.total += 1;
}
}
});
</script>

自定义一个简单的双向绑定

   <div id="root">
<input v-bind:value="something" v-on:input="something = $event.target.value">
<div>{{something}}</div>
</div>
//v-bind 绑定一个值,v-on检测触发值的变化
<script>
//定义局部子组件 var App = new Vue({
el: "#root",
data: {
something: ""
},
});
</script>

子组件与父组件的数据双向绑定

   <div id="root">
<custom-input v-model="something"></custom-input>
{{something}}
</div>
//v-bind 绑定一个值,v-on检测触发值的变化
<script>
//定义局部子组件
var custom = {
template: `<input type="text" v-bind:value="value" v-on:input="handleInput">`,
props: ["value"],//1.子组件接受一个value值就等于v-model绑定的值
methods: {
handleInput: function(e) {
this.$emit("input",e.target.value);
}
}
} var App = new Vue({
el: "#root",
data: {
something: "1212"
},
components: {
"custom-input": custom
}
});
</script>
   <div id="root">
<custom-input v-model="something"></custom-input>
{{something}}
</div>
//v-bind 绑定一个值,v-on检测触发值的变化
<script>
//定义局部子组件
var custon = {
template: `<input type="text" v-bind:check="value" v-on:input="handleInput"`>,
props: ["value"],//1.子组件接受一个value值就等于v-model绑定的值
methods: {
handleInput: function(e) {
this.$emit("input",e.target.value);
}
}
} var App = new Vue({
el: "#root",
data: {
something: ture
},
components: {
"custom-input": custom
}
});
</script>

Vue总结(三)的更多相关文章

  1. 一天带你入门到放弃vue.js(三)

    自定义指令 在上面学习了自定义组件接下来看一下自定义指令 自己新建的标签赋予特殊功能的是组件,而指定是在标签上使用类似于属性,以v-name开头,v-on,v-if...是系统指令! v-是表示这是v ...

  2. Vue省市区三级联选择器V-Distpicker的使用

    Vue省市区三级联选择器V-Distpicker的使用 最近用的Vue+Element UI时,有些地方需要用到省市区三联选择器,网上安装并尝试了多种类似的插件,但都因为无法正常实现或是没有眼缘而弃用 ...

  3. vue.js 三种方式安装--npm安装

    Vue.js是一个构建数据驱动的 web 界面的渐进式框架.     Vue.js 的目标是通过简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易上手,便于与第三方库或既有项目整合.     ...

  4. 【转】vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  5. 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:

    小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...

  6. vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  7. vue.js 三种方式安装

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  8. 【Vue高级知识】细谈Vue 中三要素(响应式+模板+render函数)

    [Vue高级知识]细谈Vue 中三要素(响应式+模板+render函数):https://blog.csdn.net/m0_37981569/article/details/93304809

  9. day 82 Vue学习三之vue组件

      Vue学习三之vue组件   本节目录 一 什么是组件 二 v-model双向数据绑定 三 组件基础 四 父子组件传值 五 平行组件传值 六 xxx 七 xxx 八 xxx 一 什么是组件 首先给 ...

  10. 总结Vue第三天:模块化和webpack模块化打包:

    总结Vue第三天:模块化和webpack模块化打包: 一.❀ 模块化 [导入import-----导出export] 1.为什么需要模块化? JavaScript 发展初期,代码简单地堆积在一起,只要 ...

随机推荐

  1. event内存泄漏

    C#内存泄漏--event内存泄漏 内存泄漏是指:当一块内存被分配后,被丢弃,没有任何实例指针指向这块内存, 并且这块内存不会被GC视为垃圾进行回收.这块内存会一直存在,直到程序退出.C#是托管型代码 ...

  2. Redis常用命令速查 <第二篇>【转】

    一.Key Key命令速查: 命令 说明 DEL 删除给定的一个或多个 key,不存在的 key 会被忽略,返回值:被删除 key 的数量 DUMP 序列化给定 key,返回被序列化的值,使用 RES ...

  3. JavaScript / JQuery事件委托如何实现?

    一:什么是事件委托? 事件委托是利用事件冒泡,只指定一个事件处理程序来管理某一类型的所有事件. 事件委托就是利用事件冒泡原理实现的! 事件冒泡:就是事件从最深节点开始,然后逐步向上传播事件: 例:页面 ...

  4. c++类模板初探

    #include <iostream> #include <string> using namespace std; // 你提交的代码将嵌入到这里 ; template &l ...

  5. servlet中Cookie的编码问题

    a.什么是Cookie的编码问题?      Cookie只能存放合法的ascii字符,如果是非asicc字符(比如中文),     需要转换成合法的ascii字符的形式.  b.如何处理?     ...

  6. [NOIP2011提高组]Mayan游戏

    题目:洛谷P1312.Vijos P1738.codevs1136. 题目大意:在一个7行5列的棋盘(左下角坐标0,0)上,有一些不同颜色的棋子. 规定某一时刻,连续三个横排或竖列的棋子颜色相同,则它 ...

  7. python yield 生成器的介绍(转载)

    您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...

  8. CentOS6.3从光盘安装gcc(更改yum源)[转]

    转自:http://www.linuxidc.com/Linux/2012-11/73826.htm 一.加载光盘镜像 加载本地bin-DVD镜像文件到虚拟机系统,如图所示: 二.更改yum源 1.挂 ...

  9. ubuntu 各种窗体操作

    通用 ctrl+alt+0~9 改变窗体大小和是否显示 alt+F4 关闭窗体菜单键+相应启动器位置的编号打开程序 ctrl+pageup/pagedown 在tab间移动 ctrle+shift+p ...

  10. 主程的晋升攻略(4):TCP、消息分包和协议设计

    在<主程的晋升攻略(3):IP.DNS和CDN>中,一次网络请求经过DNS解析知道了目的IP,如今就要发出网络包,这里我们说一说TCP的相关话题. TCP是一种流式协议 讲网络编程的教科书 ...