Vue 基础篇

系列文章目录

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('提交成功了');
    }
}

总结

好好学,好好用,开心吖

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勒布朗-前端

请多多支持,留点爱心早餐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值