浅谈Vue基础知识(一)
首先是Vue的官网:https://cn.vuejs.org/
查看官方文档是学习Vue框架的非常必要的环节之一
Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
Vue和angular、react并列为三大主流框架,而和后两者想对比,Vue更为轻量,并且最易上手。
Vue是一种MVVM开发模式的框架,相比于以前MVP模式的开发,它可以使我们只需要关注数据的操作即可,而不是使用大量的js去操作dom,大大的简化了代码,加快了项目的开发速度,并且代码易于管理。
在使用Vue时,可以从网上下载vue.js,引入到项目中去,像引入jQuery一样,也可以使用vue-cli来建立vue项目,针对初学者,推荐第一种方法。
建立Vue项目(自然是hello world):
<!DOCTYPE html><html lang="en">
<head>
<meta charset="utf-8">
<title>
hello world
</title>
<script src="./vue.js" type="text/javascript">
</script>
</meta>
</head>
<body>
<div >{{content}}
</div>
<script type="text/javascript">
var app=new Vue({
el:'#app',
data:{ content:"hello world" }
})
</script>
</body>
</html>
v-是vue的指令:
v-model可以实现vue的数据双向绑定;
v-on绑定事件
使用v-on为button绑定一个alertMessage的事件,在vue的methods中写一个alertMessage的function,这时点击button就会弹窗显示message的数据内容
v-on可以简写为@,v-bind可以简写为: ;
<!DOCTYPE html><html lang="en">
<head>
<meta charset="utf-8">
<title>
TodoList
</title>
<script src="./vue.js" type="text/javascript">
</script>
</meta>
</head>
<body>
<div id="app">
<input type="text" v-model="inputValue"/>
<button v-on:click="handleBtnClick">
submit
</button>
<ul>
<li v-for="item in list">
{{item}}
</li>
</ul>
</div>
</body>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
list:['todo','doing','done'],
inputValue:''
},
methods:{
handleBtnClick:function() {
if(this.inputValue!=""){
this.list.push(this.inputValue);
this.inputValue='';
}
}
}
})
</script>
</html>
组件:
组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。一个应用、一个界面可以分化成一个个的小的组件。
<!DOCTYPE html><html lang="en">
<head>
<meta charset="utf-8">
<title>
TodoList
</title>
<script src="./vue.js" type="text/javascript">
</script>
</meta>
</head>
<body>
<div id="app">
<input type="text" v-model="inputValue"/>
<button @click="handleBtnClick">
submit
</button>
<ul>
<todo-item @delete="handleItemDelete" :content="item" :index="index" v-for="(item,index) in list">
</todo-item>
</ul>
</div>
</body>
<script type="text/javascript">
//全局组件
// Vue.component("TodoItem",{
// props:['content'],
// template:"<li>{{content}}</li>"
// })
// 局部组件
var TodoItem={
props:['content','index'],
template:"<li @click='handleItemClick'>{{content}}</li>",
methods:{
handleItemClick:function(){
this.$emit("delete",this.index);
}
}
}
var app=new Vue({
el:"#app",
components:{
TodoItem:TodoItem
},
data:{
list:[],
inputValue:''
},
methods:{
handleBtnClick:function() {
if(this.inputValue!=""){
this.list.push(this.inputValue);
this.inputValue='';
}
else{
alert("请输入");
}
},
handleItemDelete:function(index){
this.list.splice(index,1);
}
}
})
</script>
</html>
Vue的组件可以分为全局组件和局部组件,全局组件不需要再次声明,而局部组件需要去components中声明一下;
组件命名推荐使用驼峰式例如TodoItem,但是在使用时要变成todo-item;
可以使用v-bind从父组件向子组件传值,使用this.$emit()从子组件向父组件传值;
写一个组件,首先在组件中定义一个自定义属性props接口,为组件的提供content、index变量,先将list的内容赋值给item,在子组件中显示content内容并且将index标号赋值,
并且为生成的li中添加一个事件handleItemClick,在子组件中编写此事件的方法,每当点击时执行 this.$emit("delete",this.index);将index传递到父组件,并执行
父组件的handleItemDelete事件,然后删除对应标号的内容;
除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $
,以便与用户定义的属性区分开来。例如:vm.$data === data // => true
vm.$el === document.getElementById('example') // => true
$watch 是一个实例方法
vm.$watch('a', function (newValue, oldValue) {
// 这个回调将在 `vm.a` 改变后调用
})
v-for是循环遍历指令;
生命周期的钩子(需要在实际开发中注意)
比如 created
钩子可以用来在一个实例被创建之后执行代码,也有一些其它的钩子,在实例生命周期的不同阶段被调用,
如 mounted
、updated 和 destroyed
。生命周期钩子的 this
上下文指向调用它的 Vue 实例。
不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a)
或 vm.$watch('a', newValue => this.myMethod())
。
因为箭头函数是和父级上下文绑定在一起的,this
不会是如你所预期的 Vue 实例,
经常导致 Uncaught TypeError: Cannot read property of undefined
或 Uncaught TypeError: this.myMethod is not a function
之类的错误。
通过使用 v-once指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新;
{{}}的方式赋值会将内容默认为文本,而如果需要的内容是HTML的话就需要v-html了;比如:content的值为<span style="color:red">this is should red.</span>
<p>Using mustaches: {{ content }}</p> 显示<span style="color:red">this is should red.</span>
<p>Using v-html directive: <span v-html="content"></span></p>显示this is should red.
计算属性
<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('')
}
}
})
方法:
<p>Reversed message: "{{ reversedMessage() }}"</p>
// 在组件中
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
方法会在执行行刷新数值,而计算属性只有在它依赖的属性改变时才可以改变,计算属性只在相关依赖发生改变时它们才会重新求值。
这就意味着只要 message
还没有发生改变,多次访问 reversedMessage
计算属性会立即返回之前的计算结果,而不必再次执行函数。
这会大大的加快运行速度。但是
computed: {
now: function () {
return Date.now()
}
}
这也同样意味着下面的计算属性将不再更新,因为 Date.now()
不是响应式依赖:
计算属性和侦听属性
<!DOCTYPE html><html lang="en">
<head>
<meta charset="utf-8">
<title>
TodoList
</title>
<script src="./vue.js" type="text/javascript">
</script>
</meta>
</head>
<body>
<div id="demo">
{{ fullName }}
</div>
</body>
<script type="text/javascript">
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
}
}
})
</script>
</html>
<!DOCTYPE html><html lang="en">
<head>
<meta charset="utf-8">
<title>
TodoList
</title>
<script src="./vue.js" type="text/javascript">
</script>
</meta>
</head>
<body>
<div id="demo">
{{ fullName }}
</div>
</body>
<script type="text/javascript">
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: '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]
}
}
}
})
</script>
</html>
可以看到计算属性好多了;
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch
选项提供了一个更通用的方法,来响应数据的变化。
当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
以上是 浅谈Vue基础知识(一) 的全部内容, 来源链接: utcz.com/z/377815.html