飞道的博客

Vue 实例之数据绑定,事件,组件,生命周期!!!

505人阅读  评论(0)

关于 vue 设计模式的简介

今天讲实例,原理请参照这篇文章!vue 设计模式的简介

1.Vue实例

下面是vue 中一些属性的说明~

data 说明
el 唯一根元素
data Vue实例数据对象
watch 监听数据变化
filters 过滤器
methods 定义Vue实例中的方法
computed 计算属性
components 定义子组件

创建简单 vue 实例

<script>
  //需要使用 new 关键字
  var vm = new Vue({
   
    // 内容
  })
<script>

声明一下,以下所有案例均引用 vue.js 文件< script src="…/js/vue2.6.10.js"> </ script> 注意引用的路径~如果怕错的话,src中可以使用这个网址"https://cdn.jsdelivr.net/npm/vue/dist/vue.js",代码中出现的 yzx ,可以忽略,这是我加的作者标识~

el 唯一根标签:

在创建Vue实例时,el表示唯一根标签,class或id选择器可用来将页面结构与Vue实例对象vm中的el绑定。

<!-- 定义唯一根元素div -->
<div id="app">{
   {
   yzxname}}</div>
<script>
var vm = new Vue({
   
  el: '#app', // 通过 el 与 div 元素绑定
  data: {
   yzxname: 'yzx成功创建Vue实例!'}
})
</script>

data:

data初始数据:Vue实例的数据对象为data,Vue会将data的属性转换为getter、setter,从而让data的属性能够响应数据变化。data选项的值是对象,对象里面可以写多个值。

<!-- 定义唯一根元素 div -->
<div id="app"><p>{
   {
   name}}</p></div>
<script>
var vm = new Vue({
   
  el: '#app', // 通过el与div元素绑定
  data: {
   name: 'yzx定义初始数据'}
})
// js中获取 data数据 两种方法都可以~
console.log(vm.$data.name)
console.log(vm.name)
</script>

methods:

methods属性用来定义方法,通过Vue实例可以直接访问这些方法。在定义的方法中,this指向Vue实例本身。定义在methods属性中的方法可中的事件处理方法使用。

<div id="app">
    <!-- 为button按钮绑定click事件 -->
    <button @click="showInfo">请单击</button>
    <p>{
   {
   msg}}</p>
</div>
<script>
var vm = new Vue({
   
el: '#app',
data: {
   
  msg: '原始的值'
},
methods: {
   
   // 定义事件处理方法showInfo
   	showInfo () {
   
        this.msg = 'yzx触发单击事件'
     }
  }
})
</script>

computed:

computed 计算属性:计算属性结果会被缓存起来,当依赖的响应式属性发生变化时,才会重新计算,返回最终结果。

    <div id="app">
        <p>总价格:{
   {
   totalPrice}}</p>
        <p>单价 yzx:{
   {
   price}}</p>
        <p>数量 yzx:{
   {
   num}}</p>
        <div>
            <button @click="num == 0 ? 0 : num--">减少数量</button>
            <button @click="num++">增加数量</button>
            <button @click="logTotalPrice">计算总价格</button>
        </div>
    </div>
    <script>
        var vm = new Vue({
   
            el: '#app',
            data: {
   
                price: 20,
                num: 0
            },
            computed: {
      
                // 总价格totalPrice
                totalPrice() {
   
                    console.log("totalprice执行了")
                    return this.price * this.num
                }
            },
            methods:{
   
                logTotalPrice(){
   
                    console.log('totalprice的计算结果为'+this.totalPrice)
                }
            }
        })
    </script>

watch:

通过 watch 获取 cityName 的新值和旧值

<div id="app">
        <!-- input中的v-model用于在表单控件元素上创建双向数据绑定 -->
        <input type="text" v-model="cityName">
    </div>
    <script>
        var vm = new Vue({
   
            el: '#app',
            data: {
   
                cityName: 'yzxyzx'
            },
            watch: {
   
                cityName(newName, oldName) {
   
                    console.log(newName, oldName)
                }
            }
        })
    </script>

filters:

filters过滤器:在页面中直接操作数据,返回最终结果

    <div id="app">
        <div>{
   {
   message | toUpcase}}</div>
    </div>
    <script>
        var vm = new Vue({
   
            el: '#app',
            data: {
   
                message: 'hello yzx'
            },
            filters: {
   
                // 将 hello yzx 转换为 HELLO YZX
                toUpcase(value) {
   
                    return value ? value.toUpperCase() : ''
                }
            }
        })
    </script>

2.Vue 数据绑定

绑定样式:

Vue提供了样式绑定功能,可以通过绑定内联样式和绑定样式类这两种方式来实现。

绑定内联样式:

在vm实例的data中定义myDiv样式对象,通过v-bind绑定data中定义的myDiv对象。

    <div id="app">
        <!-- 绑定样式属性值 -->
        <div v-bind:style="{backgroundColor:pink,width:width,height:height}">
            <!-- 绑定样式对象 -->
            <div v-bind:style="myDiv"></div>
        </div>
    </div>
    <script>
        var vm = new Vue({
   
            el: "#app",
            data: {
   
                pink: 'pink',
                width: '100%',
                height: '200px',
                myDiv: {
   
                    backgroundColor: 'red',
                    width: '100px',
                    height: '100px'
                }
            }
        });
    </script>

绑定样式类名:

通过绑定data中的类名实现元素的样式。

    <style>
        .box {
   
            background-color: pink;
            width: 100%;
            height: 200px;
        }
        .inner {
   
            background-color: red;
            width: 100px;
            height: 50px;
            border: 2px solid white;
        }
    </style>
</head>
<body>
    <div id="app">
        <div v-bind:class="{box}">我是 box,,,yzx
            <div v-bind:class="{inner}">我是inner1</div>
            <div v-bind:class="{inner}">我是inner2</div>
        </div>
    </div>
    <script>
        var vm = new Vue({
   
            el: '#app',
            data: {
   
                box: 'box',
                inner: 'inner'
            }
        })
    </script>

内置指令

v-model指令:

v-model主要实现数据双向绑定,通常用在表单元素上,例如input、textarea、select等。

v-text指令:

v-text是在DOM元素内部插入文本内容,页面结构代码如下:

    <div id="app">
        <p v-text="msg"></p>
    </div>
    <script>
        var vm = new Vue({
   
            el: '#app',
            data: {
   
                msg: '我是v-text'
            }
        })
    </script>

v-html指令:

v-html(单向绑定)是在DOM元素内部插入HTML标签内容,页面结构代码如下:

  <div id="app">
    <div v-html="msg"></div>
  </div>
  <script>
    var vm = new Vue({
   
      el: '#app',
      data: {
   
        msg: '<h2>我是v-html yzx </h2>'
      }
    })
  </script>

v-bind指令:

v-bind可以实现单向数据绑定,页面结构代码如下:

<div id="app">
   <input v-bind:value="msg">   
</div>  
<script>
   var vm = new Vue({
   
       el: '#app',
       data: {
   
       msg: '我是v-bind yzx'
       }
     })
</script>

v-on指令:

v-on是事件监听指令,直接与事件类型配合使用,页面结构代码如下:

    <div id="app">
        <p>{
   {
   msg}}</p>   
        <button v-on:click="showInfo">请单击 yzx</button>   
      </div>   
      <script> 
        var vm = new Vue({
     
          el: '#app',   
          data: {
   msg: '请单击按钮查看内容'},   
          methods: {
       
            showInfo () {
    
              this.msg = '我是v-on指令'  
            }  
          }   
        })   
      </script>

【重要】v-for指令:

v-for可以实现页面列表渲染,常用来循环数组,页面结构代码如下。
注意:核心技能,通过遍历循环读取数组或序列,来依次展示对应的内容。索引是从 0开始的,JavaScript 数组可以存不同类型的数据,一般不建议存不同数据类型~🤗

  <div id="app">
    <div v-for="(value,key) in list" data-id="key">
      索引是:{
   {
   key}},元素内容是:{
   {
   value}}
    </div>
  </div>
  <script>
    var vm = new Vue({
   
      el: '#app',
      data: {
   
        list: [1, 2, 3,'y','z','x']
      }
    })
  </script>

v-if和v-show指令:

v-if用来控制元素显示或隐藏,属性为布尔值,页面结构代码如下:

    <div id="app">
        <div v-if="isShow" style="background-color:#ccc;">我是v-if yzx</div>
        <button @click="isShow=!isShow">显示/隐藏</button>  
      </div>  
      <script>  
        var vm = new Vue({
    
          el: '#app',  
          data: {
    
            isShow: true   
          }  
        }) 
      </script>

3.VUE数据绑定测验

写一个添加的功能,添加可以是固定的写法,删除默认删除最后一个的学生的记录,代码如下:

<div id="app">
        <button @click="add">添加学生</button>
        <button @click="del">删除学生</button>
        <hr/>
        <table border="1" width="36%" style="border-collapse:collapse">
         <tr align="center">
             <td>班级</td>
             <td>姓名</td>
             <td>性别</td>
             <td>年龄</td>
         </tr>
         <tr align="center" v-for="student in students">
             <td>{
   {
   student.grade}}</td>
             <td>{
   {
   student.name}}</td>
             <td>{
   {
   student.gender}}</td>
             <td>{
   {
   student.age}}</td>
         </tr>
        </table>
    </div>   
    <script>
        var vm = new Vue({
   
            el:'#app',
            data:{
   
                students:[{
   
                    grade:'1',
                    name:'yzx',
                    gender:'女',
                    age:'20'
                },{
   
                    grade:'2',
                    name:'yzx',
                    gender:'女',
                    age:'20'},
                    {
   
                    grade:'3',
                    name:'yzx',
                    gender:'女',
                    age:'20'},
                    {
   
                    grade:'4',
                    name:'yzx',
                    gender:'女',
                    age:'20'}]
            },
            methods:{
   
                add(){
   
                    var student={
   
                        grade:'1',
                    name:'yzx',
                    gender:'女',
                    age:'20' 
                    };
                    this.students.push(student)
                },
                del(){
   
                    this.students.pop();
                }
            }
        })

4. Vue 事件

v-on绑定事件:

在Vue中可以使用内置指令v-on监听DOM事件,并在触发时运行一些JavaScript代码,或绑定事件处理方法。

获取随机数 random

    <div id="app">
        <button v-on:click="count+=Math.random()">随机数</button>
        <p>yzx 自动生成的随机数是{
   {
   count}}</p>  
      </div>   
      <script>   
        var vm = new Vue({
     
          el: '#app', 
          data: {
   
            count: 0   
          }
        })
      </script>

监听按键(回车键):

    <div id="app">
        <input type="text" v-on:keyup.enter="submit">
      </div>  
      <script>
        var vm = new Vue({
   
          el: '#app',
          methods: {
   
            submit () {
   
              console.log('表单提交 yzx')
            }
          }
        })
      </script>

常见的事件修饰符

.stop事件修饰符:

在前端开发中,复杂的页面结构需要很多事件来完成交互行为。默认的事件传递方式是冒泡,同一事件类型会在元素内部和外部触发,有可能会造成事件的错误触发,所以就需要使用.stop修饰符阻止事件冒泡行为。

    <div id="app">
        <div v-on:click="doParent">
          <button v-on:click="doThis">事件冒泡</button>
          <button v-on:click.stop="doThis">阻止事件冒泡</button>
        </div>
      </div>   
      <script>
        var vm = new Vue({
   
          el: '#app',  
          methods: {
    
            doParent () {
     
              console.log('我是父元素单击事件 yzx')
            },
            doThis () {
     
              console.log('我是子元素单击事件 yzx')  
            }   
          }
        })
      </script>

.prevent事件修饰符:

HTML标签具有自身特性,例如,标签被单击时会自动跳转。在实际开发中,如果标签的默认行为与事件发生冲突,此时可以使用.prevent修饰符来阻止标签的默认行为。

    <div id="app">
        <a href="https://www.baidu.com" v-on:click.prevent>yzx 阻止默认行为</a> 
        <a href="https://www.baidu.com">yzx 不阻止默认行为</a> 
      </div> 
      <script>
        var vm = new Vue({
     
          el: '#app'
        })   
      </script>

.capture事件修饰符:

事件捕获的执行顺序是由外部结构向内部结构执行,与事件冒泡的顺序相反。

    <div id="app">
        <div v-on:click.capture="doParent">   
          <button v-on:click="doThis">事件捕获 yzx</button>
        </div>
      </div> 
      <script> 
        var vm = new Vue({
   
          el: '#app',
          methods: {
   
            doParent () {
   
              console.log('我是父元素的单击事件 yzx')
            },
            doThis () {
   
              console.log('我是当前元素的单击事件 yzx')    
            }  
          }
        })
      </script>

.self 事件修饰符:

事件修饰符.self 用来实现只有DOM元素本身会触发事件。

    <style>
      .Odiv1{
   
        width: 80px;
        height: 80px;
        background: #f00;
        margin: 5px;
      }
      .Odiv2{
   
        width: 50px;
        height: 50px;
        background: #fff;
      }
    </style>
------------------------------------------------------------------------------------
    <div id="app">
        <div class="Odiv1" v-on:click.self="doParent">a
          <div class="Odiv2" v-on:click="doThis">b</div>
        </div>
        <div class="Odiv1" v-on:click="doParent">c
          <div class="Odiv2" v-on:click="doThis">d</div>  
        </div>  
      </div>
      <script>
        var vm = new Vue({
   
          el: '#app',
          methods: {
    
            doParent () {
   
              console.log('我是父元素的单击事件 yzx')
            },
            doThis () {
    
              console.log('我是当前元素的单击事件 yzx')
            }  
          }  
        })
      </script>

.once事件修饰符:

只触发一次事件处理函数,案例页面结构代码如下

  <div id="app">
    <button v-on:click.once="doThis">yzx 只执行一次</button>
  </div>
  <script>
    var vm = new Vue({
   
      el: '#app',
      methods: {
   
        doThis () {
   
          console.log('我是当前元素的单击事件且只执行一次')
        }
      }
    })
  </script>

5. Vue 组件

组件:

在Vue中,组件是构成页面中独立结构单元,组件主要以页面结构形式存在,不同组件也具有基本交互功能。

组件特性:

  • 能够减少重复代码的编写,提高开发效率。
  • 根据业务逻辑实现复杂的项目功能。
  • 降低代码之间的耦合程度,使项目更易维护和管理。

实现计数器

  <div id="app">
    <my-component></my-component>
    <my-component></my-component>
    <my-component></my-component>
  </div>
  <script>
    Vue.component('my-component', {
   
      data () {
   
        return {
   
          count: 0
        }
      },
      template: '<button v-on:click="count++">被单击 yzx {
   {count}}次</button>'
    })
    var vm = new Vue({
    el: '#app' })
  </script>

注册局部组件:

Vue.component()方法用于全局注册组件,除了全局注册组件外,还可以局部注册组件,通过Vue实例的components属性来实现。

  <div id="app">
    <my-component></my-component>
  </div>
  <script>
    var com1 = {
   
      template: '<p>我是vm实例中的局部组件 yzx</p>'
    }
    var vm = new Vue({
   
      el: '#app',
      // 注册局部组件
      components: {
    myComponent: com1 }
    })
  </script>

template模板:

Vue提供了标签来定义结构的模板,可以在该标签中书写HTML代码,然后通过id值绑定到组件内的template属性上,这样就有利于在编辑器中显示代码提示和高亮显示,不仅改善了开发体验,也提高了开发效率。

    <div id="app">
        <p>{
   {
   title}}</p>
        <my-component></my-component>
      </div>  
      <template id="tmp1"> 
        <p>{
   {
   title}}</p> 
      </template>
      <script>  
        Vue.component('my-component', {
    
          template: '#tmp1',
          data () {
   
            return {
     
              title: '我是组件内的title数据 yzx', 
            }
          }
        })
        var vm = new Vue({
   
          el: '#app',
          data: {
     
            title: '我是vm实例的title数据 yzx'  
          }  
        })
      </script>

props传值:

props即道具,用来接收父组件中定义的数据,其值为数组,数组中是父组件传递的数据信息。
子组件接收父组件传递的数据“title”。

  <div id="app">
    <my-parent name="title"></my-parent>
  </div>
  <script>
    Vue.component('my-parent',{
   
      props: ['name'],
      template: '<div> yzx 我是父组件 {
   {name}}</div>'
    })
    var vm = new Vue({
   
      el: '#app'
    })
  </script>

$emit传值:

$ emit 能够将子组件中的值传递到父组件中去。$emit可以触发父组件中定义的事件,子组件的数据信息通过传递参数的方式完成。触发父组件中绑定的childfn事件,并传递子组件中的message数据。

  <div id="app">
    <parent></parent>
  </div>
  <template id="child">
    <div>
      <button @click="click">Send</button>
      <input type="text" v-model="message">
    </div>
  </template>
   <script>
    Vue.component('parent', {
   
      template: '<div><child @childfn="transContent"></child>' +
                  '子组件传来的值 : {
   {message}}</div>',
      data () {
   
        return {
   
          message: ''
        }
      },
      methods: {
   
        transContent (payload) {
   
          this.message = payload
        }
      }
    })
    // child组件
    Vue.component('child', {
   
      template: '#child',
      data () {
   
        return {
   
          message: '子组件的消息 '
        }
      },
      methods: {
   
        click () {
   
          this.$emit('childfn', this.message);
        }
      }
    })
    var vm = new Vue({
    el: '#app' })

v-if与v-else :

Vue中的页面结构是由组件构成的,不同组件可以表示不同页面,适合进行单页应用开发。实现登录和注册界面点击按钮进行切换(方法一)

    <div id="app">
        <a href="#" @click.prevent="flag ? flag : flag = !flag">登录 yzx</a>
        <a href="#" @click.prevent="flag ? flag = !flag : flag">注册 yzx</a>
        <login v-if="flag"></login>
        <register v-else="flag"></register>
      </div>
      <script>
        Vue.component('login', {
   
          template: '<div>登录页面</div>'
        })
        Vue.component('register', {
   
          template: '<div>注册页面</div>'
        })
        var vm = new Vue({
   
          el: '#app',
          data: {
    flag: true }   
        })   
     </script>


方法二:效果如上图,不展示了哈✌

  <div id="app">
    <a href="#" @click.prevent="comName='login'">登录 yzx</a>
    <a href="#" @click.prevent="comName='register'">注册 yzx</a>
    <component v-bind:is="comName"></component>
  </div>
  <script>
    Vue.component('login', {
   
      template: '<div>登录页面</div>'
    })
    Vue.component('register', {
   
      template: '<div>注册页面</div>'
    })
    var vm = new Vue({
   
      el: '#app',
      data: {
    comName: '' }
    })
 </script>

6. Vue 生命周期

Vue实例为生命周期提供了回调函数,用来在特定的情况下触发,贯穿了Vue实例化的整个过程,这给用户在不同阶段添加自己的代码提供了机会。

钩子函数:

钩子函数用来描述Vue实例从创建到销毁的整个生命周期。

beforeCreate和created:

创建实例对象之前或实例对象创建之后执行,案例演示如下。

  <div id="app">{
   {
   msg}}</div>
  <script>
    var vm = new Vue({
   
      el: '#app',
      data: {
    msg: 'yzx' },
      beforeCreate () {
   
        console.log('实例创建之前')
        console.log(this.$data.msg)
      },
      created () {
   
        console.log('实例创建之后')
        console.log(this.$data.msg)
      }
    })
 </script>

beforeMount和mounted:

在实例创建后,如果挂载点el存在,就进行页面挂载。

    <div id="app">{
   {
   msg}}</div>
    <script>
        var vm = new Vue({
   
          el: '#app',
          data: {
    msg: 'yzx' },
          beforeMount () {
   
          console.log('挂载之前')
          console.log(this.$el.innerHTML) // 通过this.$el获取el的DOM元素
          },
          mounted () {
   
            console.log('挂载之后')
            console.log(this.$el.innerHTML)
          }
        })
    </script>

beforeUpdate和updated:

Vue实例挂载完成后,当数据发生变化时,会执行beforeUpdate和updated钩子函数。

    <div id="app">
        <div v-if="isShow" ref="self"> yzx </div>
        <button @click="isShow = !isShow">更新</button>
        </div>
        <script>
            var vm = new Vue({
   
              el: '#app',
              data: {
    isShow: false },
              beforeUpdate () {
   
                console.log('更新之前')
                console.log(this.$refs.self)
              },
              updated () {
   
                console.log('更新之后')
                console.log(this.$refs.self)
              }
            })
         </script>

beforeDestroy和destroyed:

生命周期函数的最后阶段是实例的销毁,会执行beforeDestroy和destroyed钩子函数。

  <div id="app">
    <div ref="self">test</div>
  </div>
  <script>
    var vm = new Vue({
   
      el: '#app',
      data: {
    msg: 'yzx' },
      beforeDestroy () {
   
        console.log('销毁之前')
        console.log(this.$refs.self)
        console.log(this.msg)
        console.log(vm)
      },
      destroyed () {
   
        console.log('销毁之后')
        console.log(this.$refs.self)
        console.log(this.msg)
        console.log(vm)
      }
    })
    // 在控制台执行:vm.$destroy(),查看效果
 </script>


未经允许,禁止转载~我都不敢信我写了 18500多 字数,910 行🤔🤔 加油,不会的可以问我,觉得喜欢可以收藏 [ 暗示三连💖💖💖~~]
转载:https://blog.csdn.net/qq_44761243/article/details/109272150
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场