后端开发的我无奈学起了Vue,没想到这么顺手(Vue开发必备大全)

Posted 张子行的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后端开发的我无奈学起了Vue,没想到这么顺手(Vue开发必备大全)相关的知识,希望对你有一定的参考价值。

不会前端的程序员不是一名合格的后端开发工程师🥺

曾几何时谁又不是从html、css、css3、Jquery、Jsp入坑的呢,后面才是转的后端开发。以前别人问我:基本的前端操作你会吗?我牛逼哄哄的回答到区区前端,我能手写一个Jquery出来。可是当我真正开始进入公司开发的时候,what fack you? Vue、Bootstrap、React、JeecgBoot、就连Spring Boot配套使用的都是farmWorker我心爱的Thremleaf 就这样被无情的抛弃了。当然还有很多比较冷门的前端技术,但是当下火热的Vue、React我觉着有必要会使用哦。

正文

以一个涵盖增、删、改、查、条件查询、排序的小案例书写本文(涵盖本文所有知识点)。里面的知识点很多,将其带入开发妥妥的(完整代码在文章末尾)
在这里插入图片描述

知识点:组件间相互引用

vue中组件的概念:抽取出来单独的Vue代码片段、任何页面都能去引用它、达到的效果就是一套代码多次复用。

引用组件步骤

  1. 导入组件
  2. 声明应用哪些组件
  3. 于template中书写组件标签
<template>
  <!--必须要用div包裹-->
  <div>
   <!--3.书写组件标签-->
    <Add></Add>
 </div>
</template>

<script>
/**
 * 1. 导入组件
 */
import Add from "@/components/commentReceive/add";

export default {
  /**
   * 2. 应用组件、导入组件要与应用组件同名哦
   */
  components: {Add},
}
</script>

知识点:组件件通信

引用组件方传递数据:直接在对应的引用组件标签上面 :name=“value” 的形式传值就好了

  • 冒号:相当于v-bind 进行数据双向绑定,指定绑定的是表达式
  • name :指定通信数据的名字
  • value:指定通信数据的实体
<List :data="comments" :method="DeleteComment"></List>

被引用组件方接收数据(2种方式):组件间接收到的数据用法和data域中的数据一摸一样

props:{
	compoentName: compoentType
}
props:[compoentName]

组件间传递数据应用

index.vue中引用list.vue,同时向list.vue分别传递data数据、函数对象

在这里插入图片描述

list.vue接收对应的组件传递数据、同时将数据转手传递给 item.vue
在这里插入图片描述

item.vue真正接收对应组件间通信数据
在这里插入图片描述

知识点:vue中的AJAX

vue提供俩种选择(首先安装依赖):

  1. 安装axios:npm install axios --save
  2. 安装vue-resource :npm install vue-resource --save

vue-resource使用:在main.js中注册使用范围
在这里插入图片描述
最后在对应的vue文件中编写代码即可,用法和ajax类似不多说了

export default {
	methods: {
	    testAxios() {
	      /**
	       * axios请求
	       */
	      this.$axios({
	        method: 'post',
	        url: 'url',
	        data: {
	          username: 'data',
	          password: 666
	        }
	      }).then((result) => {
	        this.r = JSON.stringify(result);
	      })
	
	      /**
	       * vue-resource请求
	       */
	      this.$http.get("url").then(response => {
	        alert("请求成功"+response)
	      }, reponse => {
	        alert("请求失败"+reponse)
	      })
	
	    }
	  }
}

知识点:vue设置监视属性

何为监视属性 :一旦被监视属性中所引用的属性发生变化,那么监视属性是进行实时刷新的.

<script>
export default {
 data() {
    return {
      name: "demo",
    }
  },
  //name属性发生变化,那么会调用此函数,watchName的值也会随之发生变化
  watch: {
    watchName: function (value) {
      return this.name + "666";
    }
  },
}
</script>

知识点:vue本地缓存

vue本地缓存很简单的一个东西,放入与取出本地缓存操作如下:

window.localStorage.setItem('persons_key', JSON.stringify(value))
window.localStorage.getItem('persons_key')

vue本地缓存应用

深度监视persons数组,只要persons发生变化,就会把最新的persons写入到本地缓存中,每次关闭浏览器并不会清空本地缓存。每次添加一条新数据都会存入本地缓存

<template>
  <div>
    <input type="text" v-model="name" @keyup.enter="addPerson">
    <ul>
      <li v-for="(person,index) in persons" :key="index">
        {{ person.name }}
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  name: "test",
  data() {
    return {
      name: "",
      //从本地缓存中获取数据
      persons: JSON.parse(window.localStorage.getItem('persons_key') || '[]')
    }
  },
  methods: {
    addPerson() {
      let person = {name: this.name};
      this.persons.unshift(person);
    }
  },
  watch: {
    /**
     * 监控persons属性,一发生变动就把最新的persons放入localStorage
     * valus:最新的persons属性
     */
    persons: {
      deep: true,
      handler: function (value) {
        window.localStorage.setItem('persons_key', JSON.stringify(value))
      }
    }
  },
}
</script>

知识点:vue下拉选择框

select标签只匹配唯一的一个option标签,匹配规则:找select中的v-model与option中的value属性相等的那个option显示,默认是 0,未选择
在这里插入图片描述
效果图
在这里插入图片描述

知识点:vue复选框

当足球这个复选框选中时,对应的value将会被绑定到likes数组中,此时likes数组为[“foot”] , 相反如果一开始likes数组中就有 foot 属性,那么足球复选框一开始即为选中状态

<!--v-model会与value中的值进行匹配-->
<input type="checkbox" value="foot" v-model="likes"><label>足球</label>
<!--篮球默认是选中状态,除非修改isTrue属性为0或者false,那么才会取消选中状态-->
<input type="checkbox" v-model="isTrue"><span>篮球</span>
export default {
  name: "checkbox",
  data() {
    return {
      /**
       * 必须要用数组,足球复选框默认是未选中状态
       */
      likes: [],
      isTrue: 1,
    }
  }
}

vue知识点:生命周期(mounted)

mounted:只会在加载vue前执行一次,相当于 init()

vue知识点:消息订阅

  1. 安装消息订阅相关依赖: npm install --save pubsub-js
  2. 发布消息
export default {
  mounted() {
    /**
     * 发布名称为updateP的消息,此消息执行体为this.updateP(index);
     */
    pubsub.subscribe('updateP', (msg, index) => {
      this.updateP(index);
    })
  },
  methods: {
    updateP: function (index) {
    
    },

  }
}
  1. 订阅消息:不论是哪个组件都可以调用updateP方法
pubsub.publish('updateP', index);

知识点:vue事件监听

class.vue调用了person.vue且给其传递了一个方法(deleteP),deleteP具体实现莫管。

  <Person @deleteP="deleteP"></Person>

person.vue如何接收deleteP方法?在想调用传递过来的deleteP的方法中直接this.$emit(“deleteP”, index) 即可。

 pDeleteP(index, name) {
      if (window.confirm(`是否删除${name}`)) {
        //传统写法:props+this.deleteP(index);
        /**
         * 事件监听,适用于父子组件
         */
        this.$emit("deleteP", index);
      }

知识点:vue计算属性

计算属性和监视属性有点类似,我们可以把计算属性理解为data域中的一个属性即可,只是说它是动态变化的而已

<input v-model="name">
<input v-model="fullName">
<input v-model="fullName2">
data() {
    return {
      name: "demo",
    }
  },
  
computed: {
    //name属性发生变化,对应的fullName的输入框中的数值即为 return 的数值
    fullName() {
      return this.name + "zzh";
    },
    fullName2: {
      //name发生改变 fullName2 对应输入框中的内容也会发生改变
      get() {
        return this.name + "get";
      },
      //属性值fullName2对应输入框中的数值发生改变时,name绑定的对应输入框中的数值会改变为张子行
      set(value) {
        this.name = "张子行";
      }
    }
  },

知识点:vue~solt槽

通过solt槽我们在father中即可为son指定填充内容
在这里插入图片描述
在这里插入图片描述

知识点:创建前端工具类

新建一个js文件起名为logUtilsTest
在这里插入图片描述
工具类的调用

在这里插入图片描述

知识点:前端的crud操作(crud)

export default {
  name: "filter",
  data() {
    return {
      persons: [
        {name: "jack", age: 41, compelete: true},
        {name: "tom", age: 12, compelete: true},
        {name: "baba", age: 17, compelete: true},
        {name: "zzh", age: 13, compelete: false}
      ],
    }
  },
  methods: {
    //过滤留下compelete为false的数据
    deleteCompelete() {
      this.persons = this.persons.filter(person => person.compelete === false);
    },
    //遍历操作,为persons数组中所有数据的compelete属性设置为true
    isSelectAll(check) {
      this.persons.forEach(person => person.compelete = true);
    },
    //增
    addPerson(personName) {
      //添加的元素位置压入栈顶
      const person = {name: personName, age: 100, compelete: true};
      this.persons.unshift(person);

    },
    //删除
    deleteP: function (index) {
      /**
       * 不是this.persons.slice(index, 1); 注意删除方法!!!!!!!
       */
      this.persons.splice(index, 1);
    },
    //改
    updateP: function (index) {
      /**
       * 更新指定下标的一条数据为指定数据
       */
      this.persons.splice(index, 1, {name: "张子行", age: 21, compelete: false})
    },
  }
}

知识点:前端排序

  /**
   * 返回值:负数a在前,正数b在前,返回值为排序好的数组
   */
  fPerson.sort((a, b) => {
        if (this.orderType != 0) {
          /**
           * 降序
           */
          if (this.orderType === 1) {
            return a.age - b.age;
          }
          /**
           * 升序
           */
          else {
            return b.age - a.age;
          }
        }
      })

知识点:vue遍历显示

遍历数据

 persons: [{name: "jack", age: 41, compelete: true},
        {name: "tom", age: 12, compelete: true},
        {name: "baba", age: 17, compelete: true},
        {name: "zzh", age: 13, compelete: false}]
<Person v-for="(person,index) in persons" :key="index"></Person>

知识点:vue简单路由

  1. 创建路由
    在这里插入图片描述
  2. 注册路由
    在这里插入图片描述3. 使用路由
<router-link to="/class">根路由 路由class</router-link>
<!--显示对应路由的view-->
<router-view></router-view>

上述知识点综合练习

<template>
  <div>
    <!--过滤数据-->
    过滤:<input v-model="searcheName">
        <!--按回车键调用方法addPerson()-->
    添加:<input v-model="personName" @keyup.enter="addPerson(personName)">
    <!--    @deleteP用于父子组件间传递,代替函数类型传递-->
    <Person v-for="(person,index) in filterPersons"
            :key="index"
            :person="person"
            :index="index"
            @deleteP="deleteP"
    ></Person>
    <button @click="changeOrderType(1)">升序</button>
    <button @click="changeOrderType(2)">降序</button>
    <button @click="changeOrderType(0)">原来顺序</button>
    <button @click="deleteCompelete">清除已完成的任务</button>
    <input type="checkbox" v-model="isAllCheck"> 已完成 {{ compeleteSize }} / 全部
    {{ filterPersons.length }}
  </div>
</template>

<script>

import Person from "@/components/demo/person";
import pubsub from "pubsub-js"

export default {
  name: "filter",
  components: {Person},
  data() {
    return {
      myStyle: {
        bgcolor: 'white'
      },
      isAllCheckFlag: true,
      personName: "张子行",
      searcheName: "",
      orderType: 0,
      persons: [
        {name: "jack", age: 41, compelete: true},
        {name: "tom", age: 12, compelete: true},
        {name: "baba", age: 17, compelete: true},
        {name: "zzh", age: 13, compelete: false}
      ],
    }
  },
  computed: {
    isAllCheck: {
      get() {
        /**
         * 如果全部已勾选,返回true,那么此check会被选中
         */
        return this.compeleteSize === this.filterPersons.length;
      },
      /**
       * 更改所有数据状态compelete为选中状态,set中可以传入参数,参数即为check的选中状态,true、false
       */
      set(value) {
        this.isSelectAll(value);
      }
    },
    color: function () {
      return this.myStyle.bgcolor;
    },
    /**
     * 只要persons中的某个person中的compelete发生改变,对应的num也会改变
     */
    compeleteSize: function () {
      /**
       * 动态获取勾记的属性
       */
      let num = this.filterPersons.filter(person => person.compelete === true).length;
      return num;
    },
    /**
     * filterPersons的返回值和此方法中用到的数据有关
     * @returns {*}
     */
    filterPersons(以上是关于后端开发的我无奈学起了Vue,没想到这么顺手(Vue开发必备大全)的主要内容,如果未能解决你的问题,请参考以下文章

vue iview table表格 根据后端数据动态设置已选

我竟然在《我的世界》里学起了文言文

为了讨好大舅子,程序员竟当场学起了外挂???

性格内向的我选择了学习瓦工

深度视觉经典重读之一:卷积网络的蛮荒时代

?? 基于 vue2 + vuex + vue-router 构建的移动端微应用