系列文章目录
1.安装vue
2.创建Vue示例
3.数据与方法
4.生命周期
5.模板语法插值
6.模板语法指令
7.条件渲染v-if 、v-show 。列表渲染v-for使用
8.v-for、v-if 使用性能优化技巧
9.v-on/@click 监听事件
10.事件修饰符与按钮修饰符
11.系统修饰键
12.css样式class的多种用法
13.内联style
14.v-mode表单输入绑定、v-model值的绑定、v-model修饰符
15.双向绑定原理
16.todolist案例开发
17.computed计算属性 、watch监听
18.ref获取Dom
文章目录
一、安装vue
1.npm install vue
2.vue init webpack my-project(项目名称)
这里需要进行一些配置,默认回车即可
This will install Vue 2.x version of the template.
For Vue 1.x use: vue init webpack#1.0 my-project
? Project name my-project
? Project description A Vue.js project
? Author runoob test@runoob.com
? Vue build standalone
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Setup unit tests with Karma + Mocha? Yes
? Setup e2e tests with Nightwatch? Yes
vue-cli · Generated “my-project”.
To get started:
cd my-project
npm install
npm run dev
Documentation can be found at https://vuejs-templates.github.io/webpack
3.cd my-project
4.npm install
5.npm run dev
二、创建Vue示例
var data={a:1}
//创建vue实列
var vm= new Vue({
// 选项
data:data
})
vm.a//=>1 // vm.a 是响应式的
vm.b = 2 // `vm.b` 是非响应式的
vm.$data === data //=>true
var Component =Vue.extend({
data:function (){
return {a:1}
})
//对于已经创建的实例,Vue 不允许动态添加根级别的响应式 property
// 可以使用 Vue.set(object, propertyName,value) 方法向嵌套对象添加响应式property。
vue.set(vm.someObject,'b',2)
//还可以使用vm.$set ,这也是全局Vue.set方法的别名:
this.$set(this.someObject,'b',2)
三、数据与方法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<script type="text/javascript" src="./js/vue.js"></script>
<body>
<div id="app">
{{a}}
</div>
</body>
<script type="text/javascript">
// 文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例
// 我们的数据对象
var data = { a: 1 }
// 该对象被加入到一个 Vue 实例中
var vm = new Vue({
el:'#app',
data: data //第一个data是vue对象的属性,第二个data是数据对象的一个变量
})
//修改变量data的属性a值 达到响应式目的
// data.a = 'hi...new...';
//使用vm对象改变a属性的值
vm.a = "test";
//或者使用 $改变属性值
// vm.$data.a = "123";
//vm改变属性a的值与data数据对象改变属性a的值是一样的
// data.a == vm.a;
//watch 方法可以查看到获取变化前后的结果
//使用$watch方法观察a属性的前后变化 记录变化前的值和变化后的值
vm.$watch('a',function(newVal,oldVal){
console.log(newVal,oldVal);
})
vm.a = "test....";
</script>
</html>
四.生命周期
<body>
<div id="app">
<p>{{message}}</p>
<button @click="changeMsg">改变</button>
</div>
</body>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'hello world'
},
methods: {
changeMsg () {
this.message = 'goodbye world'
}
},
beforeCreate() {
console.log('------初始化前------')
console.log(this.message)
console.log(this.$el)
},
created () {
console.log('------初始化完成------')
console.log(this.message)
console.log(this.$el)
},
beforeMount () {
console.log('------挂载前---------')
console.log(this.message)
console.log(this.$el)
},
mounted () {
console.log('------挂载完成---------')
console.log(this.message)
console.log(this.$el)
},
beforeUpdate () {
console.log('------更新前---------')
console.log(this.message)
console.log(this.$el)
},
updated() {
console.log('------更新后---------')
console.log(this.message)
console.log(this.$el)
}
})
</script>
我们删除了el属性,看看结果
是不是只走了前面两个生命周期啊,后面就没走了,这个时候其实就是在等$mount被调用了,那我们加个按钮,点击按钮,手动调用一下$mount看会怎样
点击后
可以看到,生命周期继续往下走了。
这时候不知道大家是不是想起来,看到有些vue项目的main.js里面是这样的
export default new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
})
而有些vue项目中人家用的又是这样的
export default new Vue({
router,
store,
i18n,
render: h => h(App)
}).$mount('#app')
五、模板语法插值
v-once //展示,后边赋值chage并未渲染到模板页
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<script type="text/javascript" src="./js/vue.js"></script>
<body>
<div id="app" v-once>
{{msg}}
</div>
</body>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
msg:"hi vue",
}
});
vm.msg="change";
</script>
</html>
v-html //双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<script type="text/javascript" src="./js/vue.js"></script>
<body>
<div id="app">
<!-- 这段HTML标签不解析 -->
<p>Using mustaches: {{ rawHtml }}</p>
<!-- 这段渲染的HTML标签会被解析 -->
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
</div>
</body>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
rawHtml:'<span style="color:red">this is should be red</span>'
}
});
</script>
</html>
://到这种情况应该使用 v-bind 指令: v-bind:属性=“变量”
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<script type="text/javascript" src="./js/vue.js"></script>
<body>
<div id="app" v-once>
<div v-bind:class="color">
test...
</div>
</div>
</body>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
// color:'red',
color:'blue' //设置绑定属性名为color的变量值为blue
}
});
</script>
<style type="text/css">
.red{color: red;}
.blue{color: blue;font-size: 100px;}
</style>
</html>
js表达式
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<script type="text/javascript" src="./js/vue.js"></script>
<body>
<div id="app" v-once>
<!-- 进行加法运算 -->
<p>{{number + 1}}</p>
<!-- 三元运算 今天是你的生日吗 ? '是,祝你生日快乐' : '不是,同样祝你今天快乐'-->
<p>{{ ok ? 'YES' : 'NO' }}</p>
<!-- 函数运算的使用 split()将字符串以没有内容的形式拆分成字母数组,reverse()将数组翻转,join()将数组连接成字符串-->
<p>{{ message.split('').reverse().join('') }}</p>
</div>
</body>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
number:10, //数字运算
ok:0, //三元运算
message:'vue' //函数运算
}
});
</script>
</html>
六、v-for、v-if 使用性能优化技巧
情形一:先遍历,再判断时:由于v-for优先级大于v-if,所以,可以利用计算属性进行过滤优化:
<ul>
<li
v-for="item in arr"
v-if="item.isActive"
:key="user.id"
>
{{ item.name }}
</li>
</ul>
转变成
<ul>
<li
v-for="item in activeUsers"
:key="item.id"
>
{{ item.name }}
</li>
</ul>
computed: {
activeUsers: function () {
return this.arr.filter(function (item) {
return item.isActive
})
}
}
情形二:先判断再遍历时:通过不同标签进行优化:举例:
<ul>
<li
v-for="item in arr"
v-if="isActive"
:key="user.id"
>
{{ item.name }}
</li>
</ul>
转变成
<ul v-if="isActive">
<li
v-for="item in arr"
:key="item.id"
>
{{ item.name }}
</li>
</ul>
七.事件修饰符与按钮修饰符
事件修饰符
.stop - 调用 event.stopPropagation()。
.prevent - 调用 event.preventDefault()。
.capture - 添加事件侦听器时使用 capture 模式。
.self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调。
.left - (2.2.0) 只当点击鼠标左键时触发。
.right - (2.2.0) 只当点击鼠标右键时触发。
.middle - (2.2.0) 只当点击鼠标中键时触发。
.passive - (2.3.0) 以 { passive: true } 模式添加侦听器
<button @click.stop="sayHi()">点击</button>
// 等同于
methods: {
sayHi(e) {
e.stopPropagation();
}
}
<a href="https://www.baidu.com/" @click.prevent="toSay">百度</a>
// 相当于
methods: {
toSay(e) {
e.preventDefault();
}
}
按键修饰符
<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">。 // 回车键提交
<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">
<!-- 键修饰符,键代码 -->
<input @keyup.delete="onEnter">. // 一键清除内容
复制代码
例子:
// html
<div id="app">
<form action="">
<div>
用户名:
<input type="text" v-model="username">
</div>
<div>
密码:
<input type="text" v-model="password" @keyup.enter="success()">
</div>
<div>
<input type="button" value="提交">
</div>
</form>
</div>
// vue
methods: {
success(e) {
alert('提交成功了');
}
}
总结
好好学,好好用,开心吖