Vue是前端开发主流框架之一,对于开发者来说解决了好多细节问题,方便了开发,提高了效率,下面我就带来Vue2.0的一些基础的内容归纳总结,后期我会归纳Vue3.0的新变化
文章参考:
Vue基础概念
Vue教程
Vue视频教学
生命周期
就是先写好基础的东西再添加一些效果,逐层添加
就是Vue采用一个简洁的模板语法来声明式的将数据渲染进DOM系统
npm install vue
推荐一个vue开发者工具
var vm = new Vue({
el:"#app",
data:{},
methods:{}
})
<div id="root">
<h1>hello {{name}}</h1>
</div>
var vm = new Vue({
el:"#app", //用于指定当前vue实例为哪个容器服务 值通常为css选择器选择器字符串
data:{
name:"啦啦啦", // 用于存储数据 且更换CSS选择器里面所选元素的内容 暂时写成一个对象为了方便多个数据更换
},
methods:{} //先暂时不写
})
运行页面会发现出现了 hello 啦啦啦的内容;简单的初入就完成了
如果你在控制台修改vm.name=‘妮妮’ 就会发现页面被修改了 成为 hello 妮妮
总结:
- 我们不再和 HTML 直接交互了,一个 Vue 应用会将其挂载到一个 DOM 元素上
- app容器里面代码依然符合html css 代码规范 只不过混入一些特殊的vue格式规范
- {{}} 此方法可以在 html 代码里使用vue 插值
<span>Message: {{ name }}</span>
<span v-once>这个值不会被改变{{age}}</span> // 添加了v-once表示整个值不会更新
<p v-html="nei">我里面有html文本</p>
然后再配置项里面添加一写html结构
data: {
nei: "我是内部的p
",
}
<span v-bind:id="dynameic">给我绑定了一个hello的id</span>
data:{
dynameic:"hello", //给上面span标签绑定一个id值
}
这时候span就多了一个值为hello的id
{{ number + 1 }}
<span>{{ok?'yes':'no'}}</span>
指令 (Directives) 是带有 v- 前缀的特殊 attribute
<p v-if="seen">现在你看到我了</p>
这里,v-if 指令将根据表达式 seen 的值的真假来插入/移除 p元素
<div v-if="Math.random() > 0.5">
Now you see me
div>
<div v-else>
Now you don't
div>
v-for:v-for 具有比 v-if 更高的优先级
v-on:它用于监听 DOM 事件;值得注意的是它的美称要写在方法配置项里
<div @click="click1">
<div @click.stop="click2">
click me
div>
div>
var app = new Vue({
el: "#app",
data: {},
methods: {
click1: function() {
console.log("click1___");
},
click2: function() {
console.log("click2__");
}
}
})
<a v-bind:href="url">...</a>
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性值与表达式 url 的值绑定
<div id="example">
<p>Original message: "{{ message }}"p>
<p>Computed reversed message: "{{ reversedMessage }}"p>
div>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
结果:
Original message: “Hello”
Computed reversed message: “olleH”
如果我们修改vm里面的值,会发现vm.reversedMessage 的值始终取决于 vm.message 的值。
<div id="demo">{{ fullName }}</div>
<div id="demo">{{ fullName1() }}</div>
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
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:{
fullName1:function(){
return this.message.split('').reverse().join('')
}
}
})
现在再运行 vm.fullName = ‘John Doe’ 时,setter 会被调用,vm.firstName 和 vm.lastName 也会相应地被更新
同时你也会发现模板里面调用方法也能出现和计算属性一样的结果;但是两者有什么不同呢
computed:定义的函数可以直接作为变量使用
methods:必须调用才能
<div id="root">
<h3>今天天气很{{info}}h3>
<button @click="changeWeather">切换天气button>
div>
var vm = new Vue({
el: '#root',
data: {
isHot: true,
},
watch: {
isHot: {
immediate: true, // 默认false 初始化时让handler调用一下
handler(newValue, oldValue) {
console.log("isHot被修改了", newValue, oldValue);
}
}
}
})
// 第二种写法 如果创建时还不知道要监视谁 后期通过用户需求进行监视就用这一种
vm.$watch('isHot', {
immediate: true, // 默认false 初始化时让handler调用一下
handler(newValue, oldValue) {
console.log("isHot被修改了", newValue, oldValue);
}
})
操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attribute,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可
<div v-bind:class="{ active: isActive }">div>
上传多个字段内容
<div
class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }"
>div>
data: {
isActive: true,
hasError: false
}
当然,绑定的数据对象不必内联定义在模板里;利用函数接收
<div v-bind:class="classObject">div>
data: {
classObject: {
active: true,
'text-danger': false
}
}
<div v-bind:class="[activeClass, errorClass]">div>
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
<div v-bind:style="styleObject">div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
也就是通过一些指令来说明哪些结构需要显示,哪些不需要显示
如:v-if v-else-if v-show等等上面指令有描述
v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
一般来说,v-if 有更高的切换开销,而v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if较好。 来自官方文档
<div id="app">
<li v-for="n in evenNumbers">{{ n }}li>
<span v-for="n in 10">{{n}}span>
div>
var vm = new Vue({
el: "#app",
data: {
numbers: [1, 2, 3, 4, 5]
},
computed: {
evenNumbers: function() {
return this.numbers.filter(function(number) {
return number % 2 === 0
})
}
}
})
<ul>
<li v-for="(item ,index) in items" :key="index">{{index}}{{item.message}}li>
ul>
<li v-for="(value,key) in object" :key="key">{{key}}:{{value}}li>
var vm = new Vue({
el: "#app",
data: {
items: [{
message: "one"
}, {
message: "two"
}],
object: {
title: "lgh",
public: "default",
age: "19"
}
}
})
<div id="example-2">
<button v-on:click="greet">Greetbutton>
div>
var example2 = new Vue({
el: '#example-2',
data: {
name: 'Vue.js'
},
// 在 `methods` 对象中定义方法
methods: {
greet: function (event) {
// `this` 在方法里指向当前 Vue 实例
alert('Hello ' + this.name + '!')
// `event` 是原生 DOM 事件
if (event) {
alert(event.target.tagName)
}
}
}
})
也可以内联处理器中的方法
<button v-on:click="say('hi')">Say hibutton>
methods: {
say: function (message) {
alert(message)
}
<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>
<div id="app">
<input type="text" v-on:keyup.enter="submit">
<button v-on:click.ctrl="onClick">Abutton>
<button v-on:click.ctrl.exact="onCtrlClick">Abutton>
<button v-on:click.exact="onClick">Abutton>
div>
var vm = new Vue({
el: "#app",
data: {},
methods: {
submit: function() {
alert("我嗯了enter键盘了")
},
onClick: function() {
alert("alt+shift")
},
onCtrlClick: function() {
alert("only ctrl")
}
}
})
.exact 修饰符允许你控制由精确的系统修饰符组合触发的事件
你可以用 v-model 指令在表单 、
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}p>
你会发现输入框的内容会自动映射到页面上
下面是一些案例
<div id="app">
<input type="text" v-model="message" placeholder="填写">
<p>message is {{message}}p>
<textarea name="" id="" cols="30" rows="10" v-model="message1">textarea>
<hr>
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}label>
<hr>
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jacklabel>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">Johnlabel>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mikelabel>
<hr>
<span>Checked names: {{ checkedNames }}span>
<hr>
<input type="radio" id="one" value="one" v-model="picked">
<label for="one">onelabel>
<input type="radio" id="two" value="two" v-model="picked">
<label for="two">twolabel>
<span>你选择的是{{picked}}span>
<hr>
<select v-model="selected">
<option disabled value="">请选择option>
<option>Aoption>
<option>Boption>
<option>Coption>
select>
<span>Selected: {{ selected }}span>
<hr>
<div id="example-6">
<select v-model="selected1" multiple style="width: 50px;">
<option>Aoption>
<option>Boption>
<option>Coption>
select>
<br>
<span>Selected1: {{ selected1 }}span>
div>
<hr>
<select name="" id="" v-model="selected2">
<option value="" v-for="option in options" v-bind:value="option.value">{{option.text}}option>
select>
<span>Selected: {{ selected2 }}span>
div>
var vm = new Vue({
el: "#app",
data: {
message: "lgh",
message1: "我是一个好好学习想要成为前端开发程序员的的刘港辉",
checkedNames: [],
checked: "我时",
picked: [],
selected: [],
selected1: [],
selected2: 'A',
options: [{
text: 'One',
value: 'A'
}, {
text: 'Two',
value: 'B'
}, {
text: 'Three',
value: 'C'
}]
},
})
组件可以实现复用
const school = Vue.extend({
template: ` //组件模板内容
学校名称:{{schoolName}}
学校地址:{{address}}
`, //data必须是一个函数 因此每个实例可以维护一份被返回对象的独立的拷贝
data() {
return {
schoolName: "山西应用科技学院",
address: "太原市小店区北格镇"
}
}
})
2:注册组件
new Vue({
el: "#root",
components: {
// 第一个值是组件标签名 第二个值是实例名称
school: school,
}
})
3:使用组件
<div id="root">
<school></school>
</div>
通过一个对象代理对另一个对象的操作
先写一个简单的例子
let obj = {
x: 100
}
let obj1 = {
y: 200
}
Object.defineProperty(obj1, 'x', {
get() {
return obj.x;
},
set(value) {
obj.x = value;
}
})
obj1里面本来没有x这个数值,可以通过defineProperty来把obj里面的x添加到obj1上面;可以实现通过obj1去观察obj里面x的属性 及通过obj1去修改obj里面的属性值
数据代理 通过vm对象来代理data对象中属性的操作;可以更加方便的操作data中的数据
<div id="root">
<h2>{{name}}h2>
<h2>{{address}}h2>
div>
let vm = new Vue({
el: "#root",
data: {
name: '刘港辉',
address: '山西省'
}
})
1:首先我们先创建了一个vm的实例对象 实例对象里面包含 _data 这一属性 (它就等于 data)
2:通过Object.defineProperty()这一API 把 data 对象中的所有属性添加到 vm 上
3:为每一个添加到 vm 的属性都添加一个 geter seter 属性
4:利用 setter 和 getter 去操作 data 的属性