vue3.2

一、新生命周期setup

1.html化的setup

新增setup属性(比created更早执行,同时setup中this不会指向实例),更贴近html写法,这个方法onBeforeMounted之前被调用,同时vue3在生命周期中也删除了this指向,所有的方法必须自己在vue实例中调用

<script setup> 
  import { ref } from 'vue';
  let data = ref(123)
</script>
  // 此时data的值就是123,通过data.value调用访问数据

2.生命周期的延续与变化

vue3删除了create生命周期,其他生命周期方法前面写on进行访问 , 例如:onMounted、onUpdated

使用生命周期必须在vue实例中引用,销毁实例变为onUnmointed,与vue2的destroy作用一致

<script setup>  
import { onMounted, onUnmounted } from 'vue';
  // 所有生命周期用法均为回调函数
  onMounted(() => {
    console.log('创建了');    
  })
  // 销毁实例变为onUnmounted,与vue2的destroy作用一致
  onUnmounted(() => {
    console.log('销毁了');    
  })
</script>
 

二、vue3的数据、方法绑定

1.使用ref定义数据

ref在vue3中将数据转换成响应式数据结构的一种

vue3中没有了data() {} 那么就没办法劫持数据做到响应式数据,所以使用ref将数据变成响应式数据

<template>
  <div>
    <div>{{ num }}</div>
    <button @click="addNum">num+1</button>
  </div>
</template>

<script setup>
  import { ref } from "vue";
  let num = ref(1);
  let addNum = () => {
    //注意,使用ref变成响应式数据的时候,必须通过.value才可以拿到定义的数据
    num.value = num.value + 1;
    console.log("我执行了,现在的num是" + num.value);
    console.log(num);
  };
</script>

可以看到,数据变成响应式,同时num变成了对象,这样只要数据改变,数据就会被劫持,视图就会改变,需要注意拿取ref的数据必须加上value

2.使用ref获取DOM元素

<div ref="box">{{ num }}</div>

let box =ref();
console.log(box.value)

3.使用reactive定义数据

使用ref,每次都需要.value显得很麻烦,所以采用reactive将整个对象变成响应式数据

<template>
  <div>
    <div ref="box">{{ data.name }}</div>
    <button @click="setName">修改名字</button>
  </div>
</template>

<script setup>
  import {reactive} from 'vue';
  let data = reactive({
    name: '张三',
    age: 13,
    sex: '男'
  });
  const setName = () => {
    data.name = '李四';
    data.age = 18;
    data.sex = '女'
  }
</script>

template中使用reactive数据会觉得很麻烦可以使用toRefs将reactive数据解构成响应式数据

const state = reactive({
  name: '张三',
  age: 13
})

const { name, age } = toRefs(state)

如果reactive定义的是数组那么不能给数据直接赋值,否则会失去响应式

const arr = reactive([])

const getList = async () => {
  const res = await list()
  arr.push(...res.data)
}

4.方法绑定

<button @click="setFn"></button>
<script setup> 
    // 一下两种方法都可以定义函数,按照自己开发习惯定义一种即可
    /*1.*/
    const setFun = () => {
        console.log('方法函数操作')    
    }
    /*2.*/
    function setFun() {
        console.log('方法函数操作')    
    }
</script>

5.计算属性computed

计算属性的用法与vue2中产生了一定的差别

<div class="box">
    <!-- 在上方调用即可,结果为169 -->
    {{add}}
</div>
<script setup>
  import { computed, ref } from 'vue';
  const num1 = ref(13);
  const num2 = ref(13);
  // 设置变量接收
  let add = computed(() => {
      return num1.value * num2.value;
  })
</script>

6.watch监听器

watch监听器接收两个或者三个匿名函数。第一个是监听的数值,第二个是处理监听的函数,第三个是可选配置

(1)单属性监听

<input type="text" v-model="user" />

<script setup>
import { watch, ref } from 'vue';
const user = ref();
watch(
    () => user.value,
    (newVal, oldVal) => {
        console.log('新值:', newVal, '旧值:', oldVal);    
    },
    // 可选项
    {
        deep: true, // 是否开启深监听
        immediate: true // 开启自动立即执行一次
    }
)
</script>

(2)多属性监听

多属性监听有两种,一种是有几个就写几个watch,还有就是监听数据为一个数组

 <input type="text" v-model="user" />
 <input type="password" v-model="password" />
 
<script setup>
import { watch, ref } from 'vue';
let user = ref();
let password = ref();
// 同时监听这两个值,只要任意一个值发生变化,就会触发监听方法
watch(
    () => [user.value, password.vlaue],
    ([newUser, newPassword], [oldUser, oldPassword]) => {
        console.log('新值:', newUser, newPassword);
        console.log('旧值:', oldUserm oldPasssword);    
    }
)
</script>

三、路由

1.路由跳转

在vue2中使用this.$router.push等进行跳转,在vue3中没有this,这就需要借助 userRouter

import { useRouter } from 'vue-router'
const router = useRouter();
const jumpNewPage = () => {
    // 注意: 不要将router定义在方法中,这样他就不是响应式数据,会报错
    router.push({path: '/'})
}

2.路由传参

路由跳转传参有两种方式:

  • query传参,前面跳转加path路径即可,刷新也存在
  • params传参,采用路由中跳转组件的name进行跳转,否则拿不到params
<script setup>
import { useRouter } from 'vue-router';
const router = useRouter();
const jumpNewPage = () => {
    // 有两种中传参方式,query和params,两者写法不同
    
    // query更像是get传参,是显性传参,前面跳转加path路径即可,刷新也存在
    router.push({path: '/', query: {name: '首页'}})
    
    // params更像post,是隐性传参,跳转时要注意,不适用path跳转,而是采用路由中跳转组件的name进行跳转,否则拿不到params
    router.push({name: 'Home', params: {name: '首页'}})
}
</script>

3.路由接收参数

元素采用query跳转,使用query接收参数

元素采用params跳转,使用params接收参数

<script setup>
// 引入useRoute,获取是route
import {useRoute} from 'vue-router'
import {onMounted} from 'vue'
  const route = useRoute()
  onMounted(()=>{
    console.log(route.params);//结果为{name:'首页'}
    console.log(route.query);//结果为{name:'首页'}
  })
</script>

四、vuex的使用

1.创建文件

// vuex
import { createStore } from 'vuex';

export default createStore({
  // 定义state状态
  state: {
    num: 1
  },
  // 改变state状态的方法
  mutations: {
    setNum(state, newNum) {
      state.num = newNum;      
    }
  },
  // 进行异步操作
  actions: {
    // 异步递增num
    addAsync(store) {
      setTimeout(()=>{
        console.log(store.state.num += 10);          
      }, 1000)      
    }
  },
  // 划分模块
  modules: {
  }
})

2.使用store

import { useStore } from 'vuex';
import { onMounted } from 'vue';

// vuex实例
const store new useStore();
onMounted(() => {
  // 调用state 中的key
  store.state.num += 1;
  console.log(store.state.num);  // 输出结果: 2

  // 调用mutation的方法
  store.commit('setNum', 10);
  console.log(store,state.num); // 输出结果: 10

  // 调用action里的addAsync方法
  store.dispatch('addAsync') // 输出结果: 20

  // 如果vuex进行了模块化,那么state数据前面要加模块名
  store.module.state.num
  store.comm
})

五、组件

1.组件引用

组件在props里直接引入就可以在template模板中使用,无需在components中注册

<template>
  <div class="box">
    <!-- 子组件引用 -->
    <v-child></v-child>
  </div>
</template>
<script setup>
  // 只需引入无需注册注册
  import vChild from '@/components/child.vue'
  // 后续脚手架提供了自动引入注册,但是需要满足命名规范才可以
</script>

2.defineProps父子传参

  • 父组件传递给子组件数据。子组件需要使用defineProps进行接收
  • vue3 props接收必须要规定数据类型,如果父元素数据类型出错,那么会报错
  • defineProps在后续更新中将不需要从vue中解构,可以直接使用
// 父组件
<template>
    <div class="box">
        // 子组件引用
        <v-child msg='父传子数据'></v-child>
    </div>
</template>

// 子组件
<template>
    <div class="child">
        我是子组件
    </div>
</template>

<script setup>
// defineProps在后续更新中将不需要从vue中解构,可直接使用
import { defineProps } from 'vue';
// 在接收时候也得注意,vue3 props接收必须要规定数据类型,如果父元素数据类型出错,那么会报错
const props = defineProps({msg: String});
console.log(props); // Proxy {msg: '父传子数据'}
</script>

3.defineEmits用法

(1)defineEmits子传父普通用法

// 子组件
<template>
    <div class="child">
        我是子组件
    </div>
</template>
  
<script setup> 
import { defineEmits, onMounted } from 'vue';
const emit = defineEmits();
onMounted(() => {
    emit('getChildMsg', '我是子组件传递给父组件的数据');
})
</script>

// 父组件
<template>
  <div class="box">
    <!-- 接收子组件的方法 -->
    <v-child @getChildMsg="getMsg"></v-child>
  </div>
</template>
<script setup>
import vChild from '@/components/child.vue';
const getMsg = (e) => {
    console.log(e); // e是传递的参数, e: '我是子组件传递给父组件的数据'
}
</script>

(2)defineEmits的单向数据更新

/* 这是传递单向数据的组件 */
<Children v-model="dialogValue"/>  // 此时使用双向数据绑定v-model的形式传递数据

/* 这是接收单向数据的组件 */
<el-dialog
    :model-value="dialogValue" // 使用model-value是单向数据绑定,v-model是双向数据绑定
/>


const emit = defineEmits(['update:modelValue', 'initUserList'])
  
const handelValue = () => {
  emit('update:modelValue', false) // 在此必须是update:modelValue的单向数据绑定形式
}
// 普通触发emit
const handleEmit = () => {
  emit('initUserList')
}

### 如何下载并配置 Vue 3.2 版本 为了安装和使用 Vue 3.2 版本,可以按照以下方法操作: #### 方法一:通过 Vue CLI 升级至 Vue 3.2 如果已经创建了一个基于 Vue CLI 的项目,默认情况下可能是 Vue 3.0 或其他较低版本。可以通过修改 `package.json` 文件中的依赖项来升级到 Vue 3.2。 1. **确认当前项目的 Vue 版本** 打开终端,在项目根目录下运行命令查看已安装的 Vue 版本: ```bash npm list vue ``` 2. **更新 Vue 和相关依赖包** 修改 `package.json` 中的相关字段为最新版 Vue 3.2 及其生态工具版本号。例如: ```json { "dependencies": { "vue": "^3.2.0", "@vue/compiler-sfc": "^3.2.0" }, "devDependencies": { "vue-loader": "^16.x.x", // 对应 Vue 3 的 loader "webpack": "^5.x.x" // Webpack 需要支持 ES Modules } } ``` 然后执行以下命令以更新依赖: ```bash npm install ``` 3. **验证升级成功** 完成上述步骤后,再次检查 Vue 的版本是否正确升级到了 3.2[^1]。 --- #### 方法二:通过 Vite 创建 Vue 3.2 项目 Vite 是一种现代前端构建工具,它默认支持最新的 Vue 版本(包括 Vue 3.2)。以下是具体步骤: 1. 初始化一个新的 Vite 项目: ```bash npm create vite@latest my-vue-app --template vue cd my-vue-app npm install ``` 2. 启动开发服务器: ```bash npm run dev ``` 此方式会自动为你搭建好一个基于 Vue 3.2 的环境[^3]。 --- #### 新增特性概述 Vue 3.2 增加了一些重要功能,这些改进使得开发者能够更灵活地管理组件逻辑以及提升性能。主要新增特性如下: - 支持 `<script setup>` 语法糖,简化了组合式 API 的书写形式。 - 提供实验性的渲染器选项 `renderEffect`,允许自定义调度行为。 - 引入新的内置函数 `defineAsyncComponent` 和 `withDefaults`,增强了动态加载与属性设置的能力。 - 组件内部可以直接访问上下文对象而无需显式返回所有成员给模板使用[^4]。 ```html <template> <div>{{ ok }}</div> <!-- 不再需要 return --> </template> <script setup> import Foo from &#39;./Foo.vue&#39; const ok = Math.random() </script> ``` 以上代码展示了如何利用 `<script setup>` 来减少样板代码量的同时保持清晰度。 --- #### 注意事项 尽管 Vue 3.2 已经发布了一段时间,但在实际生产环境中应用前仍需测试兼容性问题。特别是当项目规模较大或者存在复杂插件集成场景时,建议逐步迁移而非一次性替换全部模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值