学习笔记目录:

Vue2.x-3.x从入门到精通完整详细学习笔记day01

Vue2.x-3.x从入门到精通完整详细学习笔记day02

Vue2.x-3.x从入门到精通完整详细学习笔记day03

Vue2.x-3.x从入门到精通完整详细学习笔记day04

Vue2.x-3.x从入门到精通完整详细学习笔记day05

Vue2.x-3.x从入门到精通完整详细学习笔记day06

更新中…

过滤器

过滤器(Filters)是 vue 为开发者提供的功能,常用于文本的格式化。过滤器可以用在两个地方:插值表达式和 v-bind 属性绑定。

过滤器应该被添加在 JavaScript 表达式的尾部,由“管道符”(就是我们的“ | ”)进行调用

过滤器的注意点

  1. 要定义到 filters 节点下,本质是一个函数

    const vm = new Vue({
        //固定写法,选择要控制的区域
        el: "#app",
        // 要渲染到页面上的数据
        data: {
            message: "hello Vue!"
        },
        // 过滤器函数,必须定义在filters节点之下
        // 过滤器本质上就是一个函数
        filters: {
         	//实现字符串的首字母大写---的函数capi   
            // 形式参数中的值就是咱们管道符之前的值
            capi(val) {
                // 字符串的charAt方法,这个方法的返回值是字符串在指定索引位置处的字符
                const first = val.charAt(0).toUpperCase();
                // 字符串的slice方法:可以截取一个字符串从指定的索引位置开始(包括所指定的字符串)到最后的字符串内容
                const other = val.slice(1);
                return first + other;
            }
        }
    
    })
    
  2. 在过滤器函数中,一定要有 return 值(因为我们在使用插值表达式调用过滤器的时候,最终显示的就是过滤器的返回值)

    <p>message 的值是 {{message|capi}} </p>
    //-----------------------------------------------
    data:{
    	message:'hello Vue!'
    },
    filters:{
    	capi(){
    		return 'abc'
    	}
    }
    //------------------------------
    //显示的结果是      message的值是 abc
    
  3. 在过滤器的形参中,可以获取到“管道符”前面待处理的那个值

  4. 如果全局过滤器和私有过滤器名字一致,此时按照“就近原则”,调用的是”私有过滤器“而不是全局过滤器

    全局过滤器额定义方式:

    //全局过滤器---独立于每一个vm实例之外
    //Vue.filter()方法接收两个参数
    //	第一个参数:是全局过滤器的名字
    //	第二个参数:是全局过滤器额"处理函数(该函数中的参数就是接收到的管道符前面的数据--也就是要进行过滤的数据)"
    Vue.filter('capi', (str) => {
        // 字符串的charAt方法,这个方法的返回值是字符串在指定索引位置处的字符
        const first = str.charAt(0).toUpperCase();
        // 字符串的slice方法:可以截取一个字符串从指定的索引位置开始(包括所指定的字符串)到最后的字符串内容
        const other = str.slice(1);
        return first + other;
    })
    
  5. 在我们正常使用的时候,我们一般也都是使用全局过滤器(代码复用),私有过滤器很少用的(需要注意的是:要这个Vue的全局过滤器生效,那么使用过滤器的标签就必须在 Vue 实例的控制范围之内(也就是说它本身或者其外面的标签被选择并创建 Vue 实例了!))

    连续使用多个过滤器

    示例代码如下:

    <p>message 的值是 {{message|capi|max}} </p>
    //-----------------------------------------
    //过程是:capi先对message操作,之后是max过滤器对 capi对message操作的返回值 进行操作
    
    过滤器传参
    • 单个过滤器传参
    //arg1和arg2是传递给过滤器filterA的两个参数
    <p>message 的值是 {{ message | filterA(arg1,arg2) }} </p>
    
    //过滤器处理函数的形参列表中:
    //	第一个参数:永远都是管道符前面的待处理的值(不会被覆盖)
    //	从第二个参数开始,才是调用过滤器是调用过程传递过来的arg1和arg2参数
    Vue.filter('filterA',(msg,arg1,arg2)=>{
        //过滤器的代码片段
    })
    
    • 多个过滤器传参
    //arg1和arg2是传递给过滤器filterA的两个参数
    <p>message 的值是 {{ message | filterA(param1) | filterB(arg1,arg2) }} </p>
    
    Vue.filter('filterA',(msg,param1)=>{
        //过滤器的代码片段
        return firstReturn;
    })
    
    //过滤器处理函数的形参列表中:
    //	第一个参数:永远都是管道符前面的待处理的值(不会被覆盖)
    //	从第二个参数开始,才是调用过滤器是调用过程传递过来的arg1和arg2参数
    Vue.filter('filterB',(firstReturn,arg1,arg2)=>{
        //过滤器的代码片段
    })
    
过滤器的兼容性

过滤器仅在 vue 2.x 和 1.x 中受支持,在 vue 3.x 的版本中剔除了过滤器相关的功能。

在企业级项目开发中:

  • 如果使用的是 2.x 版本的 vue,则依然可以使用过滤器相关的功能

  • 如果项目已经升级到了 3.x 版本的 vue,官方建议使用计算属性或方法代替被剔除的过滤器功能

具体的迁移指南,请参考 vue 3.x 的官方文档 给出的说明:

watch 侦听器

watch 侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。

使用的代码案例如下:

const vm = new Vue({
    el: '#app',
    data: { username: '' },
    watch: {
        // 侦听器本质上是一个函数,要监视哪一个数据的变化,就把数据名作为方法名即可
        // 监听username的值的变化
        // newVal是“变化后的新值”,oldVal是 “变化之前的值”
        // 新值在前,旧值在后(如果就需要一个新值,我们可以就只传入一个参数newVal,如果不需要使用相应的新值和旧值,我们可以直接不传参数)
        username(newVal, oldVal) {
            // Example:判断一个用户名是否可用
            //如果输入框中的值为空,我们就 不发送请求了
            if (newVal === '') return;

            // 调用jQuery中的Ajax请求,判断newVal是否被占用
            $.get('https://www.escook.cn/api/finduser/' + newVal, function(result) {
                console.log(result);
            })
        }
    }
})

侦听器的格式

  1. 方法格式的侦听器

    • 好处:方法格式的监听器写法比较简单,是我们在平常写代码的时候需要优先考虑的,如果没有特殊的需求,
    • 缺点1:无法在刚进入页面的时候,自动触发!!!
    • 缺点2:如果侦听的是一个对象,如果对象中的属性发生了变化,不会触发侦听器!!!
  //比如下面的这个使用方法的格式监听username的变化
  data:{
      username:'',
      info:{user:''}
  },
  watch: {
      //缺点一体现
      username(newVal, oldVal) {
          //监测大数据变化的时候要执行的函数体
          console.log(newVal,oldVal);
      },
      //缺点二体现
      info(newVal){
          //并不会根据对象的成员的变化而相应
          console.log(newVal)
      },
      
      //-------根据我们个人的需要来选取下面的这两种改善方式:
          
      //缺点二的改善方式1-----比如:我们要监听的是对象info的成员user:(我们可以直接使用单引号,然后里面写上  对象.监听的属性(){} 即可,如下:)(这种方法得到的"新值"是更新后的相应属性的值)
      'info.user'(newVal){
          console.log(newVal)
      }
      //缺点二的改善方式2-----使用对象格式的侦听器来监听相应数据的变化(这个方法得到的“新值”是整个obj对象)
  }
  1. 对象格式的侦听器

    • 好处1:可以通过 immediate 选项,让侦听器自动触发(在进入页面的时候自动触发一次侦听器)!!!
    • 好处2:可以通过 deep 选项,让侦听器深度监听对象中每个属性的变化!!!
//比如下面的这个使用对象的格式监听username的变化
data:{
    username:'',
    info:{user:''}
},
watch: {
    //好处一体现
    username: {
        handler(newVal, oldVal) {
            //监听到变化之后执行的函数体
            console.log(newVal, oldVal)
        },
        // immediate用来设置是否在打开页面的时候就立即刷新(默认值是false)
        // true表示打开页面的时候立即刷新
        // false表示的是打开的时候不会立即刷新(为false的时候的功能和我们使用方法格式的监听器的功能类似)
        immediate: true
    },
    
    //好处二体现
    info: {
        handler(newVal) {
            console.log(newVal)
        },
        //开启深度监听,只要对象中任何一个属性发生变化,都会触发“对象的侦听”
        deep: true
    }
}

计算属性

计算属性指的是通过一系列运算之后,最终得到一个属性值。这个动态计算出来的属性值可以被模板结构或 methods 方法使用。

(这里面我们使用的时候需要注意的一个就是 反引号字符串调用变量,使用 ${变量} 进行字符串拼接)

特点:

  1. 定义的时候,要被定义为“方法”
  2. 在使用计算属性的时候,当普通的属性使用即可
  3. 计算属性会缓存计算的结果,只有计算属性依赖的数据变化时,才会重新进行运算

好处:

  1. 实现了代码的复用
  2. 只要计算属性中依赖的数据源变化了,则计算属性会自动重新求值!
<div id="app">
    <div>
        <span>R</span>  
        <input type="text" v-model.number="r">
    </div>
    <div>
        <span>G</span>
        <input type="text" v-model.number="g">
    </div>
    <div>
        <span>B</span>
        <input type="text" v-model.number="b">
    </div>
    <hr>

    <!-- 专门用户呈现颜色的 div 盒子 -->
    <!-- 在属性身上:代表 v-bind 属性绑定 -->
    <!-- :style 代表动态绑定一个样式对象,他的值是一个{  } 样式对象 -->
    <!-- 在当前的样式对象中,只包含 backgroundColor 样式-->
    <!-- 字符串中使用或者说调用变量:${变量} (字符串需要使用  ==反引号== 包含!!!!-->
    <div class="box" :style="{backgroundColor:rgb}">
        {{ rgb }}
    </div>
    <button @click="show">按钮</button>
</div>
//===========================================
var vm = new Vue({
    el: '#app',
    data: {
        // 红色
        r: 0,
        // 绿色
        g: 0,
        // 蓝色
        b: 0
    },
    methods: {
        // 点击按钮,在终端显示最新的颜色
        show() { console.log(this.rgb) }
    },
    // 所有的计算属性,都要定义到 computed 节点之下
    // 计算属性在定义的时候,要定义成方法的格式

    // 虽然是在定义的时候定义成的是方法格式,但是当我们打印出来的Vue实例的时候,
    // 会发现我们以方法的形式定义的计算属性会以Vue实例对象的一个属性来展现(该属性的值是计算属性的方法形式的函数体的返回值)

    // 比如说下面的这个就是 vm.rgb => 'rgb(r,g,b)' (其中的r,g,b指的都是data里面的属性值)
    computed: {
        //rgb作为一个计算属性,要返回一个生成好的rgb(x,x,x)字符串
        // rgb:function(){}                
        rgb() {
            //注意这里面的额这个反引号的使用!!!
            return ` rgb( ${this.r} , ${this.g} , ${this.b} ) `
        }
    }
});

axios

axios 是一个专注于网络请求的库!

axios 的基本使用

我们需要知道的是:axios请求得到的数据会对原来的真实数据进行一个包装!!!

具体包装内容如下:!!!

比如:

接口服务器中的数据为

{
	status:'', msg:'',data[]
}

axios请求到数据数据之后,在真正的数据之外会套一层壳,得到的数据如下:

{
	config:[],
    data:[接口服务器中的真实数据],
    headers:{},
    request:{},
    status:xxx,
    statusText:''
}

所以我们在使用 axios的时候最关心的是结果对象的data属性里面的内容(响应得到的接口服务器中的真实数据)

  1. 发起 GET 请求:
  axios({
    // 请求方式
    method: 'GET',
    // 请求的地址
    url: 'http://www.liulongbin.top:3006/api/getbooks',
      
      //------get传参使用params,post传参使用data
      
    // URL 中的查询参数(传参)
    params: {    id: 1  },
      
    //请求体数据
    //data:{}
      //.then 是用来指定请求成功之后的回调函数的;形参中的 result 是请求成功之后的结果(Promise对象)
  }).then(function (result) {
    console.log(result)
  })
  1. 发起 POST 请求:
  document.querySelector('#btnPost').addEventListener('click', async function () {
  
    const { data: res } = await axios({
      method: 'POST', 
      url: 'http://www.liulongbin.top:3006/api/post',
      data: {
        name: 'zs',
        age: 20
      }
    })
    console.log(res)
  })
  • 如果调用某个方法的返回值是 Promise 实例,则该方法前面可以添加 await!
    await 只能用在被 async “修饰”的方法中
  document.querySelector('#btn').addEventListener('click',async function(){
  	const result =await axios({...})
  })
  • 如果使用

  • const result =await axios({…}),系统会打印出axois包装后的数据(注意并不是真正的数据),而不是Promise对象了

  • const {data} =await axios({…}),系统会将等号右边得到的axios包装后的数据对象解构返回对象的 data

  • 使用下面的这种方法的话,就可以直接将等号右边得到的axios包装后的数据解构返回对象的 data 并将该返回的data重命名为 res,(这里我们使用的是解构赋值)

document.querySelector('#btn').addEventListener('click',async function(){
	const {data:res} =await axios({...})
})

解构赋值的时候,使用“ :”进行重命名

  1. 调用axios之后,使用async/await进行简化(简化了后面的then)
  2. 使用解构赋值,从 axios 封装的大对象中,把 data 属性给解构出来
  3. 把解构出来的 data 属性,使用冒号进行重命名,一般都是重新命名为 { data : res }
直接使用 axios.get 和 axios.post 发送请求

语法格式如下:

//1.GET请求
axios.get('url地址',{
//get传参
    params: { get参数}
})
//--------------------------------
//2.POST请求
axios.post('url地址',{ post请求体参数  })

使用案例:

<button id="btnGet">直接发起GET请求</button>
<button id="btnPost">直接发起POST请求</button>
<script src="./lib//axios.js"></script>
<script>
    document.querySelector('#btnGet').addEventListener('click', async function() {
        const {  data: res } = await axios.get('www.baidu.com', {
            params: {    id: 1   }
        });
        console.log(res.data)
    })
    document.querySelector('#btnPost').addEventListener('click', async function() {
        const { data: res} = await axios.post('www.baidu.com', {id: 1 });
        console.log(res.data)
    })
</script>

在我们平常使用的时候,一般都是使用下面的这种形式(两种直接实现的方式,我们根据具体的情况使用)

const {  data: res } = await axios({...});
console.log(res.log)

Vue-cli

我们先了解一个概念:单页面应用程序

单页面应用程序(英文名:Single Page Application)简称 SPA,顾名
思义,指的是一个 Web 网站中只有唯一的一个 HTML 页面,所有的功能
与交互都在这唯一的一个页面内完成。
什么是 vue-cli

vue-cli 是 Vue.js 开发的标准工具。它简化了程序员基于 webpack 创建工程化的 Vue 项目的过程。

引用自 vue-cli 官网上的一句话:

程序员可以专注在撰写应用上,而不必花好几天去纠结 webpack 配置的问题。

4. vue 项目的运行流程

在工程化的项目中,vue 要做的事情很单纯:通过 main.js 把 App.vue 渲染到 index.html 的指定区域中。

其中:

① App.vue 用来编写待渲染的模板结构

② index.html 中需要预留一个 el 区域

③ main.js 把 App.vue 渲染到了 index.html 所预留的区域中

vue-cli 的安装和使用

vue-cli 是 npm 上的一个全局包,使用 npm install 命令,即可方便的把它安装到自己的电脑上:

npm install -g @vue/cli

使用

  1. 在终端下运行如下的命令,创建指定名称的项目:(名称尽量不要有空格和英文)
 vue cerate 项目的名称
  • 这中间会有一个预设的选择:Vue2,Vue3 和自定义(建议初学者选择)

  • 我们可以选择 版本,Babel, CSS-pre-processors(css预处理器),Linter /Formater(严格标准化,比如字符串使用单引号还是双引号,行末时候要有空格之类的,不按照这个规范的话,就会报错!!!)

  • 这第一次的话,我们可以就选择三项:版本,Babel, CSS-pre-processors(css预处理器)

  • 里面还有一个选项就是,

    //你想把插件,Babel,Elist这之类的文件的配置文件放在哪里呢?
    where do you prefer placing config for Babel,..,etc?(Use arrow keys)
    //下面有两个选项-----1,放到一个单独的文件里面(我们这第一次的话,默认是选中第一项的,如果都放在package.json文件里面的话,这个文件里面的内容就会很多,也会很乱的!不是很有利于我们的开发)    2.放在 package.json里面
    in dedicated config files
    in package.json
    
  • 选项,我们是否保存我们上面选中的所有选项,保存成一个预设,以方便我们后面的创建项目(根据个人选择哈)

  • 尤其注意:在最后一步进行项目创建的过程中,千万不要用鼠标在窗口里面乱选,否则将会被我们冻结这个创建项目的过程(导致创建暂停)-----解决方案,轻轻点击窗口的长边缘,ctrl+c,即可恢复创建!!

  • 创建完成之后,他会提示如何运行我们创建的项目(一般是两个步骤,我们依次进行即可)

  1. vue 项目中 src 目录的构成:

    assets 文件夹:存放项目中用到的静态资源文件,例如:css 样式表、图片资源
    components 文件夹:程序员封装的、可复用的组件,都要放到 components 目录下
    main.js 是项目的入口文件。整个项目的运行,要先执行 main.js
    App.vue 是项目的根组件。(定义我们所看到的UI结构)
    
  2. public

    • favicon.ico 运行项目的小图标
    • index.html 首页
  3. node_modules 相关的一些包文件

学习笔记目录:

Vue2.x-3.x从入门到精通完整详细学习笔记day01

Vue2.x-3.x从入门到精通完整详细学习笔记day02

Vue2.x-3.x从入门到精通完整详细学习笔记day03

Vue2.x-3.x从入门到精通完整详细学习笔记day04

Vue2.x-3.x从入门到精通完整详细学习笔记day05

Vue2.x-3.x从入门到精通完整详细学习笔记day06

更新中…

Logo

前往低代码交流专区

更多推荐