v-text
v-html
ref 为特定的元素添加引用标识,实例的$refs内部可以获取到
v-on 绑定事件 简写@
v-bind 单向数据绑定 :
v-for 列表渲染
v-if 条件渲染
v-else
v-show 条件渲染
v-model (MVVM)
v-text
v-html
ref是我们在vue当中获取真实dom元素的唯一方式
- <body>
- <div id="app">
-
-
- <p ref="pp">{{msg}}p>
- <p v-text="msg">p>
- <p v-html="msg">p>
-
- <button @click="test">点击获取pbutton>
-
- div>
- <script src="../js/vue.js">script>
- <script>
- new Vue({
- el:'#app',
- data(){
- return {
- msg:'i love you~'
- }
- },
- methods: {
- test(){
- console.log(this.$refs.pp.innerText);
- }
- },
- }).$mount('#app')
- script>
- body>
生命周期钩子(回调函数)
给我们机会可以干预vue的工作流程
生命周期的执行顺序是固定的
创建前 初始化数据前 数据打印看不到
创建后 初始化数据后 数据打印可以看到挂载前 初始页面不显示 初始页面的元素看不到 真实dom没有
挂载后 初始页面显示 初始页面元素可以看到
更新前 页面更新前 实例数据是对的页面渲染的数据是错的 实例数据已经更新了,页面数据没更新
更新后 页面更新后 实例数据是对的页面渲染的数据是对的 两个都更新了销毁前 实例清空前 在销毁前内部清除定时器 vm还在只是里面功能没(指令和事件)
销毁后 实例清空后 一般不用
使用mounted和beforeDestroy比较频繁,mounted内部我们经常去做异步操作,添加事件 定时器 ajax
当调用了vm.$destroy(), beforeDestroy和destroyed才会执行,beforeDestroy做收尾工作:清除定时器等
- <body>
- <div id="app">
- <p ref="pp">{{msg}}p>
- <button @click="msg = '我爱你杨幂'">点击更新button>
- <button @click="$destroy()">点击销毁button>
- div>
- <script src="../js/vue.js">script>
- <script>
- Vue.config.productionTip = false
-
- new Vue({
- data(){
- return {
- msg:'我爱你赵丽颖'
- }
- },
- // 创建阶段
- // 创建前可以找到vm但是找不到vm数据
- beforeCreate() {
- console.log(this,this.msg);
- },
- created() {
- console.log(this,this.msg);
- },
-
- // 挂载阶段
- // 挂载前拿不到真实dom 挂载后可以拿到
- beforeMount() {
- console.log(this.$refs.pp);
- },
-
- // 挂载完成用的比较多
- // 通常在这里面发请求获取动态数据,修改初始化的数据
- // 在这里也通常去开启定时器
- // 在这里给真实dom绑定事件
- mounted() {
- console.log(this.$refs.pp);
- },
-
- // 更新阶段 (页面更新阶段)
- // 任何数据更新变化,都会进入这个阶段
- beforeUpdate() {
- console.log(this.msg,this.$refs.pp.innerHTML);
- },
- updated() {
- console.log(this.msg,this.$refs.pp.innerHTML);
- },
-
- // 销毁阶段
- // 销毁前用的比较多,一般都是在做善后处理
- // 比如:解绑事件、清除定时器
- beforeDestroy() {
- console.log(this,this.msg);
- },
- destroyed() {
- console.log(this,this.msg);
- this.msg = '我爱你迪丽热巴'
- },
- }).$mount('#app')
-
- script>
- body>
自定义过滤器
过滤器
过滤顾名思义是筛选的意思,但是在vue当中过滤器不是筛选的意思
它是把数据进行二次加工
定义过滤器分为全局过滤器和局部过滤器
展示数据的时候,对数据进行处理(格式化之后再显示,不会影响原数据)
使用moment插件
定义全局过滤器
Vue.filter('过滤器名字',回调函数);
定义局部过滤器
在vm当中fliters对象当中配置
- <body>
- <div id="app">
- <p>{{timeNow}}p>
- <p>{{timeNow | dateFormat}}p>
- <p>{{timeNow | dateFormat('YYYY-MM-DD')}}p>
- <p>{{timeNow | dateFormat('hh:mm:ss')}}p>
- div>
-
- <div id="app1">
- <p>{{timeNow}}p>
- <p>{{timeNow | dateFormat}}p>
- <p>{{timeNow | dateFormat('YYYY-MM-DD')}}p>
- <p>{{timeNow | dateFormat('hh:mm:ss')}}p>
- div>
-
- <script src="../js/vue.js">script>
- <script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.4/moment.min.js">script>
- <script>
-
- // 全局
- // Vue.filter('dateFormat', (value, format = 'YYYY-MM-DD hh:mm:ss') => {
- // return moment(value).format(format)
- // })
-
- new Vue({
- el: '#app',
- data: {
- timeNow: new Date().getTime() //Date.now()
- },
- // 局部
- filters: {
- dateFormat: (value, format = 'YYYY-MM-DD hh:mm:ss') => {
- return moment(value).format(format)
- }
- }
- })
-
- new Vue({
- el: '#app1',
- data: {
- timeNow: new Date().getTime() //Date.now()
- }
- })
-
-
- script>
- body>
自定义指令
定义全局指令
Vue.directive('过滤器名字',回调函数);
定义局部指令
在vm当中directives对象当中配置
注意:指令的名称必须是全小写,不能大写
- <body>
- <div id="app">
- <p v-text="msg">p>
- <p v-upper="msg">p>
- div>
-
- <div id="app1">
- <p v-text="msg">p>
- <p v-upper="msg">p>
- div>
-
- <script src="../js/vue.js">script>
- <script>
- // 定义全局指令
- // 指令名不带v- 并且指令名必须全小写
- // Vue.directive('upper', (node, bindings) => {
- // // console.log(node,bindings);
- // // 获取到元素和元素所绑定的数据
- // // 手动给元素的内容改成大写
- // node.textContent = bindings.value.toUpperCase()
- // })
-
- new Vue({
- el: '#app',
- data: {
- msg: 'i love you~'
- },
- directives: {
- upper: (node, bindings) => {
- // console.log(node,bindings);
- // 获取到元素和元素所绑定的数据
- // 手动给元素的内容改成大写
- node.textContent = bindings.value.toUpperCase()
- }
- }
-
- })
-
- new Vue({
- el: '#app1',
- data: {
- msg: 'i love you~'
- }
- })
-
- script>
- body>
自定义插件
插件的作用:
定义插件函数或者对象,为Vue和Vue的实例添加一些额外功能插件必须声明使用 Vue.use()
(function( w) {
})( window );
声明使用插件,所有的官方插件都要声明使用
本质:
如果是函数式插件就是直接调用这个函数
如果是对象式插件,那么就找到对象的install方法去调用
- <body>
- <div id="app">
- <p v-upper="msg">p>
- div>
- <script src="../js/vue.js">script>
- <script src="../js/myplugin.js">script>
-
- <script>
- console.log(MyPlugin); //插件已经被放在window对象身上
-
- Vue.use(MyPlugin)
-
- Vue.myGlobalMethod()
-
- let vm = new Vue({
- el:"#app",
- data(){
- return {
- msg:'aaaa'
- }
- }
- })
-
- vm.$myMethod()
- script>
- body>
自定义组件(非单文件组件)
什么是组件: (js css html xml img 字体图标 svg 等) 代码和资源的集合叫组件
什么是组件化: 针对项目来说 这个项目由多个组件构成 就称这个项目是组件化的项目
什么是模块: 一个js文件(一个模块不单单可以是js文件)
什么是模块化: 这个项目由多个模块构成 就称这个项目是模块化的项目
vue和react都是去做单页应用的,单页应用一般肯定都是组件化的
- <body>
- <div id="app">
-
-
- <mybutton>mybutton>
- <mybutton>mybutton>
- <mybutton>mybutton>
- <mybutton>mybutton>
- <mybutton>mybutton>
- div>
- <script src="../js/vue.js">script>
- <script>
- // 组件的使用就是三大步:
- // 1、定义
- // 定义一个组件本质是定义了一个函数,函数后期是当构造函数用的
- let VueComponent = Vue.extend({
- // 配置对象,这个配置对象和vue的配置对象几乎一样,除了没有el以外
- data(){
- // 面试题:为什么组件当中data必须是函数,不能写对象
- return {
- count:0
- }
- },
- // data:{
- // count:0
- // },
- template:'
我爱你赵丽颖
' - })
- // 2、注册(全局注册和局部注册)
- // 注册的本质其实是把一个名字和定义生成的函数进行绑定
- // 全局注册
- // Vue.component('mybutton',VueComponent)
- // 3、使用
- // 直接写标签,标签名就是你注册的名字
-
- new Vue({
- el:'#app',
- // 局部注册组件
- components:{
- mybutton:VueComponent
- },
- data(){
- return {
- // count:0
- }
- }
- })
- script>
- body>
简化:
- <body>
- <div id="app">
-
-
- <mybutton>mybutton>
- <mybutton>mybutton>
- <mybutton>mybutton>
- <mybutton>mybutton>
- <mybutton>mybutton>
- div>
- <script src="../js/vue.js">script>
- <script src="./mybutton.js">script>
- <script>
- // 下面这个写法是简写
- // 这里虽然不用extend生成函数,但是会把配置对象作为第二个参数,本质在函数Vue.component内部
- // 还是要先用extend把第二个参数作为配置对象生成函数的,再用生成的函数和第一个参数进行绑定
- // 全局定义并注册
- // Vue.component('mybutton',{
- // // 配置对象,这个配置对象和vue的配置对象几乎一样,除了没有el以外
- // data(){
- // return {
- // count:0
- // }
- // },
- // // data:{
- // // count:0
- // // },
- // template:'
我爱你赵丽颖
' - // })
-
- // Vue.component('mybutton',mybutton)
-
- // 3、使用
- // 直接写标签,标签名就是你注册的名字
- new Vue({
- el: '#app',
- // 局部定义并注册组件
- components: {
- mybutton
- },
- data() {
- return {
- // count:0
- }
- }
- })
- script>
- body>
mybutton.js
- (function(w){
- w.mybutton = {
- // 配置对象,这个配置对象和vue的配置对象几乎一样,除了没有el以外
- data(){
- return {
- count:0
- }
- },
- // data:{
- // count:0
- // },
- template:'
我爱你赵丽颖
' - }
- })(window);
缺点:
这样定义组件麻烦、模板没提示
样式没法单独搞,
没法使用模块化解析ES6语法后期我们都是约定成俗(习惯性)把一个.vue文件称作是一个组件,但是本质上它只是暴露了一个配置对象
配置对象必须在Vue.component()之后,才能定义并注册成为一个组件,接着才能写标签使用
为什么组件当中data必须是函数,不能写对象
如果写对象,由于配置对象是同一个,如果组件复用,实例化出来的组件对象里的数据用的是同一个data,
使用函数,每个组件都有自己的数据,每次实例化一个对象,都会调一次函数,调用函数时,会return一个新的对象