学习vue 九 nextTick 函数式编程 编译宏 环境变量

news2024/11/17 5:59:56

nextTick

js事件循环机制

所有的同步任务都是在主进程执行的形成一个执行栈,主线程之外,还存在一个"任务队列",异步任务执行队列中先执行宏任务,然后清空当次宏任务中的所有微任务,然后进行下一个tick如此形成循环。

nextTick 就是创建一个异步任务,那么它自然要等到同步任务执行完成后才执行。

案例:

写一个聊天框要求在每次发送完新的信息之后,导航条滑到最低端

<template>
  <div ref="box" class="wraps">
    <div>
      <div class="item" v-for="item in chatList">
        <div>{{ item.name }}:</div>
        <div>{{ item.message }}</div>
      </div>
    </div>
  </div>
  <div class="ipt">
    <div>
      <textarea v-model="ipt" type="text" />
    </div>
    <div>
      <button @click="send">send</button>
    </div>
  </div>
  <HelloWorld></HelloWorld>
</template>

<script setup lang='ts'>
import { reactive,ref,nextTick } from 'vue'

let chatList = reactive([
  { name: '张三', message: "xxxxxxxxx" },
])
let box = ref<HTMLDivElement>()
let ipt = ref('')
//Vue 更新dom是异步的 数据更新是同步
//我们本次执行的代码是同步代码
//当我们操作dom 的时候发现数据读取的是上次的 就需要使用nextIick
const send = async () => {
  chatList.push({
    name:"李四",
    message:ipt.value
  })
  //1.回调函数模式
  // nextTick(() => {
  //   box.value!.scrollTop = 99999999
  // })
  //2.async await 写法 await以下全部为异步代码
  await nextTick()
  box.value!.scrollTop = 99999999
}
</script>

<style scoped>
.wraps {
  margin: 10px auto;
  width: 500px;
  height: 400px;
  overflow: auto;
  overflow-x: hidden;
  background: #fff;
  border: 1px solid #ccc;
}
.wraps .item {
  width: 100%;
  height: 50px;
  background: #ccc;
  display: flex;
  align-items: center;
  padding: 0 10px;
  border-bottom: 1px solid #fff;
}

.ipt {
  margin: 10px auto;
  width: 500px;
  height: 40px;
  background: #fff;
  border: 1px solid #ccc;
}
.ipt textarea {
  width: 100%;
  height: 100%;
  border: none;
  outline: none;
}
.ipt button {
  width: 100px;
  margin: 10px 0;
  float: right;
}
</style>

函数式编程

主要使用h函数去写模板,为什么要使用h函数,因为h函数会直接调用createVNode函数,生成虚拟dom性能上面会有所提升

h函数接受三个参数

  • type 元素的类型
  • propsOrChildren 数据对象, 这里主要表示(props, attrs, dom props, class 和 style)
  • children 子节点

案例:

定义一个按钮

<script setup lang='ts'>
import { ref,h } from 'vue'
const fs = ref("16px")
const tableRef = ref([
  { name: '张三', age: 18, gender: '男' },
  { name: '李四', age: 20, gender: '女' },
  { name: '王五', age: 22, gender: '男' },
  { name: '赵六', age: 24, gender: '女' },
])
type Props = {
  text: string
}
const Btn = (props:Props,ctx:any) => {
  return h("button",{
    style:{
      width:"100px",
      height:"30px",
      fontSize:fs.value,
    },
    onClick:()=>{
      console.log("按钮被点击了")
      console.log(props.text)
    }
  },ctx.slots.default())
}
</script>

<template>
  <div class="btn">
    <button @click="fs = '15px'">小</button>
    <button @click="fs = '20px'">中</button>
    <button @click="fs = '22px'">大</button>
  </div>
 <table border="1">
   <thead>
     <tr>
       <th>姓名</th>
       <th>年龄</th>
       <th>性别</th>
       <th>操作</th>
     </tr>
   </thead>
   <tbody>
     <tr v-for="item in tableRef" :key="item.name">
       <td>{{ item.name }}</td>
       <td>{{ item.age }}</td>
       <td>{{ item.gender }}</td>
       <td>
         <Btn text="这是要被传入props的">编辑</Btn>
         <Btn>删除</Btn>
       </td>
     </tr>
   </tbody>
 </table>
</template>

<style scoped>
.btn {
  width: 50%;
  margin: 0 auto;
}
.btn button {
  margin: 0 10px;
  padding: 5px 10px;
  font-size: 16px;
  border: 1px solid #ccc;
  border-radius: 5px;
  cursor: pointer;
}
table {
  width: 50%;
  margin: 20px auto;
  border-collapse: collapse;
  font-size: v-bind(fs);
  text-align: center;
}
</style>

编译宏

Vue 3.3新增了一些语法糖和宏,包括泛型组件、defineSlots、defineEmits、defineOptions

defineProps

父子组件传参

案例:

父组件

<script setup lang='ts'>
import { ref } from 'vue'
import B from './components/B.vue'
const text = ref('hello')
</script>

<template>
  <B :text="text"></B>
</template>

<style scoped>

</style>

子组件

<script setup lang="ts">
const props = defineProps<{
  text: string
}>()
console.log(props.text)
</script>

<template>
  <h1>{{text}}</h1>
</template>

<style scoped>

</style>

vue3.3 新增可以给defineProps增加一个泛型

<script setup generic="T" lang="ts">
const props = defineProps<{
  text: T[]
}>()
console.log(props.text)
</script>

<template>
  <h1>{{text}}</h1>
</template>

<style scoped>

</style>

这样的话,text的类型就更加的灵活

defineEmits

父组件

<script setup lang='ts'>
import { ref } from 'vue'
import B from './components/B.vue'
const text = ref([1, 2, 3])
function handleEmit(data: any) {
    console.log(data)
}
</script>

<template>
  <B :text="text" @change="handleEmit"></B>
</template>

<style scoped>

</style>

子组件常规方法派发事件

<script setup generic="T" lang="ts">
import {onMounted} from "vue";
const props = defineProps<{
  text: T[]
}>()
const emit = defineEmits<{
  (e: 'change', value: string): void
}>()
onMounted(() => {
  emit('change',"我已经传值")
})
console.log(props.text)
</script>

<template>
  <h1>{{text}}</h1>
</template>

<style scoped>

</style>

Vue3.3 新写法更简短

<script setup generic="T" lang="ts">
import {onMounted} from "vue";
const props = defineProps<{
  text: T[]
}>()
const emit = defineEmits<{
  change: [string]
}>()
onMounted(() => {
  emit('change',"我已经传值")
})
console.log(props.text)
</script>

<template>
  <h1>{{text}}</h1>
</template>

<style scoped>

</style>

环境变量

环境变量:他的主要作用就是让开发者区分不同的运行环境,来实现 兼容开发和生产

例如 npm run dev 就是开发环境  npm run build 就是生产环境等等

Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量

  1. BASE_URL: "/"
  2. DEV: true
  3. MODE: "development"
  4. PROD: false
  5. SSR: false

注意:环境变量不能通过变量的形式添加或者修改即: import.meta.env[mode] = xxx 

因为这些环境变量在打包的时候是通过硬编码通过Json.stringify的方式注入到浏览器的

配置额外的环境变量 

在开发环境中:

1. 在更目录下创建文件.env.development

 

 2. 修改启动命令

在 package json 配置 --mode env文件名称

 

 这样就配置完成,可以在env上看到了

 

在生产环境中

创建 .env.production  在执行npm run build 的时候他会自己加载这个文件 

在文件中写入配置的变量即可 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android13禁用打开wifi ap 热点

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 这个文章介绍的是如何禁止用户打开wifi热点,禁止用户安装app后,打开wifi热点。 2.情况分析 android13 应用层打开wifi AP public void setWifiApEnabled(boolean isEn…

XSS小游戏(题目+解析)

xss题目练习地址&#xff1a; xss小游戏 游戏界面 一、Ma Spaghet! 我将题目要求进行翻译: 题目的主要要求就是&#xff1a;弹出一个&#xff08;1337&#xff09;的弹窗 开始解题&#xff1a; Let’s Go! 首先&#xff0c;传个参数看看 发现参数直接显示在了 < h2 >…

.bat文件快速运行vue项目

如何使用bat文件快速运行vue项目&#xff1f; 新建个文件&#xff0c;改名为serve.bat。 在文件中写入以下内容&#xff1a; # cd 项目路径 cd D:\projects\xxx npm run serve pausecd 项目所在的路径 npm run dev/serve &#xff0c;取决于项目的启动方法&#xff0c;打…

三维重建理论

应用领域&#xff1a; 三维重建基础&#xff1a; 相机成像 三维重建算法&#xff1a;

20240817 每日AI必读资讯

知网状告AI搜索&#xff1a;搜到我家论文题目和摘要&#xff0c;你侵权了&#xff01; - 知网指责秘塔AI搜索侵犯合法权益&#xff0c;要求断开链接并商务合作 - 秘塔AI搜索强调学术文献的开放获取对知识公平获取和科学研究至关重要 - 团队决定尊重知网选择&#xff0c;不再…

【vSphere 7/8】深入浅出 vSphere 证书 Ⅰ—— 初识和了解 vSphere证书

目录 引子1. vCenter Server 证书服务1.1 vSphere 安全证书&#xff08;1&#xff09;vSphere 安全证书的类型和有效期 1.2在 vSphere Client 中初识 vSphere 证书&#xff08;1&#xff09;vCenter 8.0.3 的 vSphere Client 界面&#xff08;2&#xff09;vCenter Server 7.0 …

idea付费插件激活

以下idea付费插件均可激活 获取链接&#xff1a;https://web.52shizhan.cn

OD C卷 - 围棋的气

围棋的气&#xff08;100&#xff09; 围棋棋盘由纵横19条线垂直相交组成&#xff0c;一共19x19361个交点&#xff0c;黑白棋子只能置于交点上&#xff1b;某个棋子的“气”是指其上、下、左、右四个方向的交叉点上&#xff0c;有几个交叉点没有棋子&#xff1b; 在棋盘边缘的…

【学习笔记】A2X通信的协议(十一)- 通过PC5的直接C2通信

目录 9. 通过PC5的直接C2通信 9.1 概述 9.2 程序 9.2.1 直接C2通信的C2授权程序 9.2.2 通过NR-PC5的直接C2通信程序 3GPP TS 24.577 V18.1.0的技术规范&#xff0c;主要定义了5G系统中A2X通信的协议方面&#xff0c;特别是在PC5接口和Uu接口上的A2X服务。以下是文件的核心…

2024零基础入行软件测试全网最全攻略

很多朋友想要入行软件测试&#xff0c;但是都不知道该怎么学。 抽个时间简单的给大家说下&#xff0c;对于0基础的朋友&#xff0c;应该怎么去学习软件测试。 学习软件测试有2条路可以选。 最省事的当然是找个靠谱的培训机构去培训啦&#xff0c;你就什么都不用想了&#xff0c…

todoList清单(HTML+CSS+JavaScript)

&#x1f30f;个人博客主页&#xff1a; 前言&#xff1a; 前段时间学习了JavaScript&#xff0c;然后写了一个todoList小项目&#xff0c;现在和大家分享一下我的清单以及如何实现的&#xff0c;希望对大家有所帮助 &#x1f525;&#x1f525;&#x1f525;文章专题&#xff…

三维点云深度网络 PointNeXt 源码阅读 (IV) —— PointNeXt-B

Title: 三维点云深度网络 PointNeXt 源码阅读 (IV) —— PointNeXt-B 文章目录 I. PointNeXt-B 与其他版本的区别II. PointNeXt-B 自动生成的网络III. PointNeXt-B 编码部分的结构IV. 显存溢出的规避总结 关联博文 [1] 三维点云深度网络 PointNeXt 的安装配置与测试 [2] 三维点…

Spring IOC 小演示

首先建项目&#xff0c;可参考 https://blog.csdn.net/2303_79008526/article/details/141141114?spm1001.2014.3001.5502 一、spring 环境搭建 &#xff08;一&#xff09;导相关坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmln…

高通AI-让AI触手可及

生成式AI模型&#xff0c;例如大语言模型和大视觉模型&#xff0c;需要大量的计算资源进行推理&#xff0c;这对于传统的CPU和GPU等通用处理器来说是一个挑战。 1 NPU和异构计算的优势 NPU (神经网络处理器): 专门为AI推理设计的处理器&#xff0c;具有高性能、低功耗的特点&…

Eval绕过限制参数限制

PHP Eval函数参数限制在16个字符 PHP代码 <?php$param $_REQUEST[param]; if (strlen($param) < 17 && stripos($param, eval) false && stripos($param, assert) false){eval($param);}?># 部署环境属于ubuntu系统 通过GET传参绕过 由于是…

贪吃蛇+SDL2库【1】(c语言)

小白的学习记录 一、前置知识 注&#xff1a;博主是小白&#xff0c;所以记录的可能是一些无意中看到&#xff0c;但是不清楚的东西&#xff0c;所以大家择需了解。 JSON JSON&#xff08;JavaScript Object Notation&#xff09; 是一种轻量级的数据交换格式&#xff0c;易于…

10690 分面包

### 伪代码 1. 读取输入的 n 和 m&#xff0c;以及 m 个面包的长度 L。 2. 定义一个函数 canDivide(length)&#xff0c;判断是否可以将所有面包分成每人 length 长度的面包。 3. 使用二分法查找每人分得的最长面包长度&#xff1a; - 初始化 low 为 0&#xff0c;high 为所…

前端工程化-04.Vue项目简介

一.Vue项目-创建 1.使用如图两种方式创建Vue项目 2.在此创建新项目 点击创建项目 创建成功&#xff01; 二.Vue项目-目录结构 三.Vue项目-运行 启动后直接在下方找到连接端口 成功启动项目 这个项目即为Vue中的自带项目Vue.app。修改其中的Home为Vue Home。ctals保存发…

数学建模预测类—【一元线性回归】

每日格言&#xff1a;行动是治愈恐惧的良药&#xff0c;而犹豫拖延将不断滋养恐惧. 目录 前言 一、什么是回归分析&#xff1f; 1.概念理解 2.分类和一般步骤 二、一元线性回归&#xff08;Matlab算法&#xff09; 1.利用regress函数 2、例题讲解 总结 前言 在具体讲述线性回归…

如何在 Windows 10 中配置住宅 IP

什么是住宅IP 住宅IP指的是普通家庭网络的 IP 地址。你可以这样想&#xff1a; IP地址&#xff1a;每一个接入互联网的设备都有一个唯一的“地址”&#xff0c;就像每栋房子都有一个唯一的门牌号一样&#xff0c;这个地址就是IP地址。 住宅IP&#xff1a;指的是那些来自家庭用…