Vue2和Vue3的语法区别

1.创建Vue2项目

---此处使用@vue/cli脚手架快速创建项目(打包方式webpack)  ---Vetur 插件(VS code)

>>>npm create 项目名

---npm run serve 项目启动命令

项目结构如下

Vue2基本页码结构如下   HTML-js-CSS

<template>
  <div id="app">
    <span>这是一个vue2页面</span><br/>
    <span>年龄是{{age}}岁</span><br/>
    <button @click="ageChange">Button</button>
  </div>
</template>

<script>
export default{
  name: "HomeView",
  //定义数据
  data(){
    return{
      age:1
    }
  },
  //定义方法
  methods:{
    ageChange(){
      this.age += 1
    }
  },
  //计算属性
  computed:{ 

  },
  //监听属性
  watch:{

  }
 }
</script>


<style>
</style>

-------------------------------------------------页面元素如下-------------------------------------------------------------

---展示数据的三种情况

  • v-html
  • v-text
  • {{ }} 

snippet generator snippet generator

自定义代码生成模版快捷键 

2.Vue2的相关语法

2.1计算属性

  • 插值表达式中利用运算符进行计算属性
  • 方法中进行计算属性
  • 计算属性中运算

面试题---方法和computed的区别

  • computed有缓存,而且是一个属性
  • 方法,是函数,使用需要调用 FUN()
<template>
  <div id="app">
    <span>这是一个vue2页面</span><br/>
    <span>测试计算属性的两种方法</span><br/>
    {{ name1 + name2}}<br/>
    {{ changeName() }}<br/>
    {{Name}}<br/>
     
  </div>
</template>

<script>
export default{
  name: "HomeView",
  data(){
    return{
      name1:"lihua",
      name2:"zhangwei"
    }
  },
  methods:{
    //方法一:定义方法
    changeName(){
      return this.name1 + this.name2
    }

  },
  computed:{ 
    //方法2:计算属性
    Name(){
      return this.name1 + this.name2
    }
  },
  watch:{

  }
 }
</script>


<style>
</style>

2.2监听属性

v-model 数据双向绑定

v-model可以监听data()中数据,也可以监听computed的计算属性数据

不可以监听方法

<template>
  <div id="app">
    <span>这是一个vue2页面</span><br/>
    <span>测试属性监听</span><br/>
    <input type="text" v-model="name">
  </div>
</template>

<script>
export default{
  name: "HomeView",
  data(){
    return{
      name:"hello"
    }
  },
  methods:{
  },
  watch:{
    name(newValue,oldValue) {
       console.log(newValue,oldValue);
    }
  }
 }
</script>


<style>
</style>

----------------------------------------------------------控制台结果----------------------------------------------------

2.3相关指令

v-bind:xx = " "  动态绑定xx属性

v-bind:title     --->  动态绑定title属性 ---> 简写 :title 

<template>
  <div id="app">
    <span>vue2-测试动态绑定css样式</span><br/>
    <div v-bind:style="s1">大连市</div>
    
  </div>
</template>

<script>
export default{
  name: "HomeView",
  data(){
    return{
     s1:{color:"green"}
    }
  }
 }
</script>


<style>
</style>

---页面效果如下---

 

v-on 给HTML元素绑定事件监听器 简写 @

2.4定义属性

var-let-const---定义属性的关键字 

var:属性可以重复声明,let和const属性不可以重复声明

var和let声明变量,const声明常量

const声明的常量不能改变的(内存固定),可以改变其内部属性

2.5条件渲染

v-if 为true 渲染元素 ,false反之

可以配合 v-else-if 和 v-else 使用

注意:v-else必须跟在v-else-if后面使用,v-else-if 必须跟在 v-else-if 或者 v-if后面使用(紧挨

v-show 为true 渲染元素,false反之

二者的区别

  • v-if:每次都会重新生成或者创建元素
  • v-show:被渲染的元素始终保存在DOM中,只是切换元素的dispaly:none样式

v-if 切换消耗高,v-show 初始渲染消耗高 

---------------------------------------------------------------------------------------------------------------------------------

v-for指令

<template>
  <div id="app">
    <span>vue2-测试循环指令</span><br/>
    <ul>
       <li v-for="(item, index) in arr" :key="index">
          {{ item }}
       </li>
    </ul>
  </div>
</template>

<script>
export default{
  name: "HomeView",
  data(){
    return{
     arr:[123,456,789]
    }
  }
 }
</script>


<style>
</style>

网页效果如下

3.Vue2的组件

3.1 父组件引入子组件

  • 父组件引入(import)子组件 
  • 父组件中注册子组件  component:{ childrenComponent }
  • 父组件使用子组件 

3.2 父组件传值子组件

子组件通过 props 属性进行接收

  • type:传值属性的类型
  • default:未接收到父组件时的默认值
......

<script>
export default{
  props:{
    mes:{
        type:String,
        default:'子组件默认值',
    },
  },
  data(){
    return{
    }
  },
  methods:{

    }
  }
</script>

......

3.3 子组件传值父组件

自定义事件 emit 传值

 ---子组件

<template>
 <div>
    <button @click="transfor">子组件向父组件传值按钮</button>
 </div>
</template>

<script>
export default{
  props:{

  },
  data(){
    return{
    }
  },
  methods:{
      transfor(){
                   //第一个参数是自定义事件的名字,第二个参数是子向父传值的数据
        this.$emit('transforFather','子组件向父组件传值的数据')
      }
    }
  } 
</script>


<style>
</style>

---父组件

<template>
  <div id="app">
    <span> {{title}}</span><br/>
    <Children  @transforFather="jieshou"></Children>
  </div>
</template>

<script>
import Children from './components/Children.vue'
export default{
  data(){
    return{
      title:"vue2-测试子向父传值"
    }
  },
  components:{
    Children
  },
  methods:{
    jieshou(value){
      this.title = value;
    }
  }
 }
</script>

<style>
</style>

---页面样式

---点击按钮事件后页面样式

 

4.创建Vue3项目 

>>>npm init vite@latest (打包方式vite) ---Volar插件(VS code)

启动Vue3项目命令

>>>npm run dev

4.1Vue3的组件结构

<template>
  <div id="app">
    {{title}}<br>
    <button @click="change">Vue3点击按钮事件</button>
  </div>
</template>

<script setup>
//定义属性
const title = "这是一个Vue3页面"
//定义方法
const change = ()=>{
  console.log(123)
}
</script>

<style>
</style>


4.2Vue3的响应式变量

面试题: ref和reactive的异同

--->let title = ref("这是一个Vue3页面")

 --->let obj = reactive({
       name:"zhiping",
       age:18,
       phone:123
       })

  • 同:ref和reactive都是用来定义响应式变量的关键字
  • 异:ref一般用来定义基本数据类型 ,但也可以定义复杂数据类型
  •        reactive一般只能用来定义对象数组引用型数据类型
​
<template>
  <div id="app">
    {{title}}<br>
    <button @click="changeRef">ref点击按钮事件</button><br>
    name:{{ obj.name }}<br>
    age:{{ obj.age }}<br>
    phone:{{ obj.phone }}<br>
    <button @click="changeReactive">reactive点击按钮事件</button><br>
  </div>
</template>

<script setup>
import {reactive, ref} from 'vue'
//定义属性
let title = ref("这是一个Vue3页面")

let obj = reactive({
  name:"zhiping",
  age:18,
  phone:123
})
//定义方法
const changeRef = ()=>{
 title.value = "响应式变量的值"
}
const changeReactive=() =>{
  obj.age = 123,
  obj.name = "xinyi",
  obj.phone = 456
}
</script>

<style>
</style>

 点击按钮页面效果如下--------------------------------------------------------------------------------------------------

4.3Vue3的箭头函数 

普通函数 function fn(){ }

箭头函数 function fn = ()=>{ }

箭头函数和普通函数的区别

1.写法区别

箭头函数:若没有参数,括号不可以省略;若参数只有一位,括号可以省略

普通函数:若函数体只有一行,那么{}(花括号)可以省略,retrun可以省略

2.this指向区别

箭头函数:箭头函数的this指向定义时,外层第一个普通函数的this

普通函数:this指向的是外层的第一个对象

4.4Vue3的插槽

子组件Test.vue如下

---子组件的标签处采用插槽 待填充

父组件App.vue 如下

---父组件中引入子组件 并填充插槽(默认填充)

 ---页面

---具名插槽的使用

name绑定插槽的作用域

 

填充插槽时绑定作用域时可以简写

默认情况  v-slot --- #default

具体插槽 v-slot:xx --- #xx

4.4Vue3的生命周期

  • 创建前(setup):beforeCreate(),created()
  • 渲染时:beforeMount(),mounted()
  • 更新时:beforeUpdate(),updated()
  • 销毁时:beforeUnmount(),unmounted()

beforeMount()组件挂载到节点时执行的函数

mounted()页面开始渲染后执行,可用来进行页面初始化

4.6Vue3的前后端联结

什么是同源策略?

协议,域名,端口号 一致 --- 可以接收请求

跨域的解决措施

1.配置跨域

    1.1 注解  

@CrossOrigin

    1.2 全局配置

2.反向代理

---前端配置信息

---后端配置文件(application.properties)

  • server.port:XX(具体端口号)
  • server.servlet.context-path=/api

--------------------------------------------------------测试-------------------------------------------------------------------

页面效果如下---

前端代码---

<template>
  <div id="">
    <button @click="get">get</button>
    <button @click="post">post</button>
  </div>
</template>

<script setup>
import axios from 'axios'
const get = () => {
  axios.get("http://localhost:8080/get").then((res)=>{
    console.log(res)
  })
}
const post = () => {
  axios.post("http://localhost:8080/post").then((res)=>{
    console.log(res)
  })
}
</script>

<style>
</style>

 后端代码---

package com.example.demo.controller;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author xiaozhuang
 * @create 2023-11-08-21:45
 */
@RestController
@CrossOrigin
public class AxiosController {

    @GetMapping("/get")
    String get(){
        return "这是一个get请求";
    }

    @PostMapping("/post")
    String post(){
        return "这是一个post请求";
    }

}

按钮点击页面效果

---网页直接发起请求 

 

---浏览器只能发送get请求,不能发送post请求,否则如下报错

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值