学习笔记

vue2.0 - 学习笔记

by 猪皮怪, 2022-08-04


v-text

类似于{{ }},更改元素内textContent,好处在于防止用户网络阻塞时短暂看到{{ }}占位符。

v-html

可以解析文本内的html标签,直接生成html标签文本。如果绑定的数据内包含html内容且需要渲染到页面上,需要用v-html。

v-show

控制标签元素的display属性,控制其显示或隐藏。

v-if和v-else

相较v-show,渲染页面时v-if会删除不符合的元素,而v-show是单纯通过style控制元素display属性。v-show效率高,v-if效率低,如果只控制一个元素是否显示,用v-show,如果控制两个及以上元素显示,用v-if。

v-for

基于源数据多次渲染元素或模板块,这里的of和in是一样的。用的时候一定要加key。key应该是数组中不重复的值,否则会导致数据出错。

<ul>
  <li v-for="n of name">{{n}}</li>
</ul>
<script>
  var vm = new Vue({
    el:'#app',
    data:{
      name:['aa','bb','cc']
    },
    methods:{
      
    }
  })
</script>
<ul>
      <li v-for="(n,i) in name">{{i+1}} => {{n}}</li>
</ul>
<script>
  var vm = new Vue({
    el:'#app',
    data:{
      name:['aa','bb','cc']
    },
    methods:{

    }
  })
</script>
<li v-for="(n,i) in name" :key="i">{{i}} => {{n}}</li>

v-on

<div id="pop" v-on:click="say()"></div>
可以简写成
<div id="pop" @click="say></div>

v-once

只渲染一次,用于优化性能。

v-cloak

要配合css的[v-cloak]{display: none;}使用,在网络不顺畅时可以避免元素短暂显示。

<div id="app">
    <h1 v-cloak>{{uname}}</h1>
    <h1 v-text="`用户名:${uname}`"></h1>
</div>
<script>
    setTimeout(function (){
        var vm = new Vue({
            el:'#app',
            data:{
                uname:"okokokok"
            },
            methods:{
            }
        })
    },2000)
</script>

v-bind

用于绑定属性。如果元素内容可能会变化,则用{{}}绑定,如果是元素属性发生变化,用:或者v-bind绑定。绑定属性的时候,该方式是单向绑定,即从data到页面中,不能从页面到data。

<div id="app">
  <img :src="pm25">
</div>
<script>
    var vm = new Vue({
      el:'#app',
      data:{
        pm25:'img/src.jpg'
      },
      methods:{
      }
    })

v-model

双向绑定。代替v-bind,数据实时更新。

v-pre

如果内容中想显示双花括号如{{}},如使用该指令,则不会编译{{}}的内容。

组件系统

先创建组件,再自动生成组件。生成的前提是要求模板有唯一的父元素。组件内没有el,el替换成template,template用反引号 引起来。组件内的data必须要是函数的返回,即return,不能是平时的data对象。模板的名字不要用驼峰命名法。

  <script>
    Vue.component("my-counter",{
      template:`<div><button @click="minus">-</button><span>{{n}}</span><button @click="add">+</button></div>`,
      data(){return{n:1}},
      methods:{
        minus(){this.n--;this.n==0&&(this.n=1)},
        add(){this.n++}}})
  </script>
</head>
<body>
  <div id="app">
    <ul>
      <li><my-counter></my-counter></li>
      <li><my-counter></my-counter></li>
      <li><my-counter></my-counter></li>
    </ul>
  </div>
  <script>
    var vm = new Vue({el:'#app',})
  </script>

全局组件、局部组件

局部组件一定要注意创建顺序,先写子组件再写父组件。局部组件用components引入子组件。

<head>   
  <script>
        var todoAdd = {
            template: `<div><input type="text"><button>+</button></div>`
        }
        var todoItem = {
            template: `<li>1 - 吃饭<a href="javascript:;">删除</a></li>`
        }
        var todoList = {
            template: `<ul>
        <todo-item></todo-item>
        <todo-item></todo-item>
        <todo-item></todo-item>
    </ul>`,
            components: {todoItem}
        }
        Vue.component('todo', {
            template: `<div><h1>todo</h1>
    <todo-add></todo-add><todo-list></todo-list>
    </div>`,
            components: {todoAdd, todoList}
        });
  </script>
</head>
<body>
<div id="app">
    <todo></todo>
</div>
<script>
    new Vue({el: '#app',})
</script>

组件生命周期

四个阶段:create/mount/update/destroy,即创建,挂载,更新,销毁

<script>
    new Vue({
            el: '#app',
            data: {
                count: 0
            },
            beforeCreate() {
                console.log('创建组件前触发')
            },
            created() {
                console.log('创建组件后触发')
            },
            beforeMount() {
                console.log('挂载组件前触发')
            },
            mounted(){
                console.log('挂载组件后触发')
            },
            beforeUpdate(){
                console.log('更新组件data中的变量之前自动触发')
            },
            updated(){
                console.log('更新变量后自动触发')
            },
            beforeDestroy(){
                console.log('销毁当前组件之前自动触发')
            },
            destroyed(){
                console.log('销毁当前组件后触发')
            }
        }
    )
</script>

自定义指令

过滤器

如果值需要加工之后再显示,需要用过滤器,过滤器需要传参,需要return 返回处理后的值。

<head>
  <script>
        Vue.filter('moneyFilter',function (oldVal){return `¥${oldVal.toFixed(2)}`})
  </script>
</head>
<body>
<div id="app">
    <h1>价格:{{price | moneyFilter}}</h1>
</div>
<script>
    new Vue({
        el: '#app',
        data: {price: 12.5}})
</script>
</body>
<head>    
  <script>
        Vue.filter('moneyFilter',function (oldVal,type){
          return `${type||'¥'}${oldVal.toFixed(2)}`
        })
  </script>
</head>
<body>
<div id="app">
    <h1>价格:{{price1 | moneyFilter}}</h1>
    <h1>价格:{{price2 | moneyFilter('$')}}</h1>
</div>
<script>
    new Vue({
        el: '#app',
        data: {price1: 12.5,price2:22}})
</script>
</body>

组件属性

计算属性

watch属性

父子组件通信

子组件需要用父组件的数据,形成嵌套关系。
父用props给子通信,子组件用props声明期望从父组件获取的数据。特别要注意在父组件内标签上用bind语法与父组件建立通信渠道。

<head>    
<script>
        var todoAdd = {
            template: `<div><input type="text"><button>+</button></div>`
        }

        var todoItem = {
            template: `<li>{{ k+1 }} - {{ t }}<a href="javascript:;" @click="del">删除</a></li>`,
            props:['t','k','tasks'],
            methods:{
                del(){
                    this.tasks.splice(this.k,1)
                }
            }
        }

        var todoList = {
            template: `<ul>
        <todo-item v-for="(t,k) in tasks" :key="k" :t="t" :k="k" :tasks="tasks"></todo-item>
    </ul>`,
            props:['tasks'],
            components: {todoItem}
        }

        Vue.component('todo', {
            template: `<div><h1>todo</h1>
    <todo-add></todo-add><todo-list :tasks="tasks"></todo-list>
    </div>`,
            data(){return{tasks:['吃饭','吃饭饭','吃饭饭饭']}},
            components: {todoAdd, todoList}
        });
    </script>
</head>
<body>
<div id="app">
    <todo></todo>
</div>
<script>
    new Vue({el: '#app',})
</script>
</body>

子组件如果要调用父组件函数,需要用$emit()触发父组件函数。

<head>
    <script>
        var todoAdd = {
            template: `<div><input v-model="task" type="text"><button @click="add">+</button></div>`,
            data(){return{task:''}},
            methods:{
                add(){
                    this.$emit('add',this.task)
                    this.task=''
                }
            }
        }
        
        Vue.component('todo', {
            template: `<div><h1>todo</h1>
    <todo-add @add="add"></todo-add></div>`,
            data(){return{tasks:['吃饭','吃饭饭','吃饭饭饭']}},
            components: {todoAdd, todoList},
            methods:{add(task){
                this.tasks.push(task)
                }}
        });
    </script>
</head>
<body>
<div id="app">
    <todo></todo>
</div>
<script>
    new Vue({el: '#app',})
</script>
</body>

打通父子通信!!!

父调子:
this.$refs.引用.函数名
子调父:
this.$parent.函数名
父组件要在模板中加ref=''.

兄弟通信

路由

  1. 指定路由容器
  2. 创建各个组件
  3. 配置路由

    <router-link to="/details">详情</router-link>
    var router = new VueRouter({
     routes:[
         {path:'/',component:Index},
         {path: '/details',component: Details},
     ]
    })

    路由传参

    .vue文件内固定格式

    <template>
    </template>
    
    <script>
    export default {
    }
    </script>
    <style scope>
    </style>

作者: 猪皮怪

2024 © esia.asia 27 ms