zoukankan      html  css  js  c++  java
  • 初识Vue之API

    前言 Hi~ o( ̄▽ ̄)ブ

    好家伙,科目三终于过了,硬生生给我拖了一年。
    今年毕业生找工作难,大三找实习也难。我已经预见到了我无根浮萍的惨状了。诶≡(▔﹏▔)≡
    说回代码,前面算是配置了router,接下来就是写页面了。

    页面/组件

    页面上.vue与.html文件整体结构上并没有区别

    <template>
      <div>
    
      </div>
    </template>
    
    <script>
      export default {
        name: 'index',
      }
    </script>
    
    <style>
    
    </style>
    

    也是html+js+css的样式。值得一提的是在vue中在<template>下的第一个<div>是作为一个根源root节点的形式,有一些的API如v-for不能使用。

    实例

    即在创建Vue实例中所用到的API

    • data

    在文件中用于存放数据。

      export default {
          data () {
                return {
          }
    }
    

    在使用中需要加一个return,其目的是为了防止变量污染。也就是全局变量和局部变量的区别

    • props

    props需要child与parent的配合,即子组件通过props可以访问到父组件的数据。具体可以看IrishMan
    的用法详解与官方文档的示例

    • propsData

    propsData就不用多说,与上一个相差无几。区别在于一个接收一个传值。
    官方实例如下:

    var Comp = Vue.extend({
      props: ['msg'],
      template: '<div>{{ msg }}</div>'
    })
    
    var vm = new Comp({
      propsData: {
        msg: 'hello'
      }
    })
    
    • computed

    computed被称为计算属性,默认预设getter,按需要可以添加getter。我的理解是与methods功能类似,不同是computed第一次被调用后进行缓存,随着变量更改而再次调用,如果没有变量就仅加载调用一次。对页面中非变量的渲染以及实时改变的变量渲染应该是有优势的?不是非常理解。gunelark栀子花的讲解应该还是比较详细的。

    • methods

    一个主要写js方法的地方

    • watch

    监测数据变动,基础了解是动态改变数据关联的状态,分为普通监听以及深度监听,类似于前者只监听root,后者遍历监听包括root在内的所有子节点,使用的话还是有待实战。

    • directives

    • filters

    • components

    加载声明组件,如之前配置router以及import vue文件使用

    • parent

    父组件,与之对应的是child。一般通过.extend关联

    • minxins

    我的理解是和继承类似?官方解释是混合,但没有看明白和extends的区别在哪里

    • extends

    很明显,继承

    • provide/inject

    和之前的props好像是一种类型的,provide for 提供变量,inject接受变量。其解释是在父组件的生命周期内,其下所有子组件都可以inject调用。

    指令

    • v-on

    和html中的事件绑定是一样的功能,但一些修饰符的不同需要注意,缩写:@

    • v-bind

    通常用于绑定src,key,to等标签属性,将文本标记为变量。缩写::

    • v-model

    类似于在html中的type?

    • v-slot

    描述是将其他props过来的组件的插槽......router-view???啧,有点懵

    • v-once

    标记仅渲染一次,第一次渲染过后其内容为静态内容。

    生命周期

    • beforeCreate

    实例初始化后,未加载组件属性

    • created

    组件属性创建完成,DOM未生成,无$el

    • beforeMount

    模板编译之前,实例数据初始化都已完成

    • mounted

    模板编译后,挂载完成

    • beforeUpdata

    数据更新后view层变化前

    • updata

    数据更新完成

    • activated

    仅对于中的的变化,于其中组件激活时调用

    • deactivated

    仅对于中的的变化,于其中组件移除时调用

    • beforeDestroy

    实例销毁前

    • destroyed

    实例销毁后调用

    • errorCaptured

    错误捕获......这让我想到了try.....catch

    生命周期图示

    DOM

    html创建DOM树——>css创建StyleRules——>两者创建Render树——>Render树页面布局Layout——>绘制Painting

    其他API

    还有全局配置啊,全局api啊,实例property啊,说实话我都搞不清楚......唉有用到再看吧。扒拉出官方API文档链接这块就凑合了。

    最后

    以hmtl写了一个底部导航栏

    <template>
        <div id="footer" >
          <div class="tab"v>
            <router-link to="/store">
              <div>
                <img src="../assets/home.png">
              </div>
              <span>外卖</span>
            </router-link>
          </div>
    
          <div class="tab">
            <router-link to="/shop">
              <div>
                <img v-if="running" src="../assets/shop.png">
    
              </div>
              <span>超市</span>
            </router-link>
          </div>
    
          <div class="tab">
            <router-link to="/order">
              <div>
                <img src="../assets/text.png">
              </div>
              <span>订单</span>
            </router-link>
          </div>
    
          <div class="tab">
            <router-link to="/my">
              <div>
                <img src="../assets/my.png">
              </div>
              <span>我的</span>
            </router-link>
          </div>
        </div>
    </template>
    
    <script>
        export default {
          name: "footer",
          data() {
            return{
              running : 1,
            }
          },
          methods:{
    
          }
        }
    </script>
    
    <style>
      #footer{
        background-color: white;
        position: fixed;
         100%;
        border:1px solid #C0C0C0;
        height:6%;
        bottom: 0;
        left: 0;
      }
      a{
        text-decoration:none;
      }
      span{
        color: black;
        text-align: center;
        font-size: 12px;
      }
      img{
         22px;
        height: 22px;
        margin-top: 5px;
      }
      .tab{
        float: left;
        25%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
      }
    </style>
    

    但这种要去实现高亮切换的js功能就有点麻烦....所以我用vue的方式(v-for+v-bind+v-if)重写了一个

    <template>
    
      <div id="footer" >
        <div class="tab" v-for="(x,i) in tabs" :key="i" @click="addClassName(i)">
          <router-link :to="x.url">
            <div>
              <img v-if="flag != i" :src="x.img">
              <img v-if="flag == i" :src="x.active">
            </div>
            <span>{{x.title}}</span>
          </router-link>
        </div>
      </div>
    </template>
    
    <script>
        export default {
          name: "footer",
          data() {
            return{
              flag:0,
              tabs:[
                {
                  title:"外卖",
                  url:'/store',
                  img: require('../assets/home.png'),
                  active:require('../assets/home_fill.png')
                },
                {
                  title:"超市",
                  url:'/shop',
                  img:require('../assets/shop.png'),
                  active:require('../assets/shop_fill.png')
                },
                {
                  title:"定单",
                  url:'/order',
                  img: require('../assets/text.png'),
                  active: require('../assets/text_fill.png')
                },
                {
                  title:"我的",
                  url:'/my',
                  img: require('../assets/my.png'),
                  active: require('../assets/my_fill.png')
                },
              ]
            }
          },
          methods: {
            addClassName: function (index) {
              this.flag = index;
            },
          }
        }
    </script>
    
    <style>
      #footer{
        background-color: white;
        position: fixed;
         100%;
        border:1px solid #C0C0C0;
        height:6%;
        bottom: 0;
        left: 0;
      }
      a{
        text-decoration:none;
      }
      span{
        color: black;
        text-align: center;
        font-size: 12px;
      }
      img{
         22px;
        height: 22px;
        margin-top: 5px;
      }
      .tab{
        float: left;
        25%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
      }
    </style>
    
    

    最后效果:

    后言ヾ( ̄▽ ̄)ByeBye

    感觉很焦虑...诶...还是自己太菜了...
    据说Vue3.0的版本有更多的API,尤大佬还在搞Vite.....好家伙,学不完了。
    VUE先放一放,还是返回去学下html和js的基础吧。有点弱....

  • 相关阅读:
    RTOS双向链表数据结构
    [LintCode] Majority Number(以时间复杂度O(n)求主元素)
    [LintCode] Median(期望时间复杂度O(n)求中位数和第k大数)
    [LintCode]unique paths with obstacles
    [LintCode]unique paths
    [LintCode]sqrt(x)
    排序算法(C++实现)
    优先队列C++实现
    散列之分离链接法
    AVL树C++实现
  • 原文地址:https://www.cnblogs.com/YX-blogs/p/13227977.html
Copyright © 2011-2022 走看看