vue3.x之isRef toRefs isRef readonly 公共数据配置 axios配置 路由配置

2023-11-18

isRef toRefs

toRef

参数: (源对象 , 源对象属性)

可以用来为源响应式对象上的某个 property 新创建一个 ref。然后,ref 可以被传递,它会保持对其源 property 的响应式连接。

也就是说源响应式对象(toRef的第一个参数) 上的某个 property 新创建一个 ref

<template>
  <div>
   <p>{{x}}</p>
   <p>{{y}}</p>
   <button @click="changeXY">changeXY</button>
   <button @click="look">look</button>
  </div>
</template>

<script setup>
import { isRef, reactive, ref, toRef } from "vue";
let obj = reactive({x:10,y:20})
let {x,y} = obj
x = toRef(obj,"x");
y = toRef(obj,"y");
function changeXY(){
  x.value = 15
  y.value++
}
function look(){
  console.log(x,obj.x,y,obj.y);
}
</script>

在这里插入图片描述

toRefs

将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref。

主要功能:当从组合式函数 (.js) 返回响应式对象时,用toRefs就可以在不丢失响应性的情况下对返回的对象进行解构/展开。

toRef 是转单个, toRefs全转

原理:toRefs 会将 reactive 生成的对象的根级属性全都用 ref 转成 ref 对象,然后解构出来的都是 ref 对象,从而不丢失响应式

<!-- 案例一  -->
<template>
  <div>
   <p>{{name}}</p>
   <p>{{age}}</p>
   <button @click="change">change</button>
   <button @click="look1">look1</button>
  </div>
</template>

<script setup>
import { isRef, reactive, ref, toRef, toRefs } from "vue";
let obj1 = reactive({name:"karen",age:20})
let {name,age} = toRefs(obj1);
function change(){
  name.value = "Ben"
  age.value = 50
}
function look1(){
  console.log(name.value,obj1.age);
}

</script>

在这里插入图片描述

isRef

检查值是否为一个 ref 对象

<template>
  <div>
   <p>{{msg}}</p>
   <button @click="fn">isRef</button>
  </div>
</template>

<script setup>
import { isRef, ref } from "vue";

let msg = ref(0)
let msg1 = 0
function fn(){
  console.log(isRef(msg));
  console.log(isRef(msg1));
}
</script>

在这里插入图片描述

readonly

readonly 是将通过ref 或reactive定义好的数据进行拷贝后变为仅可读的数据,不可进行修改,即无响应

如强制修改 浏览器控制台就会报警告

在这里插入图片描述

公共数据配置

因为 vue2.x 使用公共配置时一般绑定在原型上无论是否使用都在每一个组件的this链上,这样的设计不太好,所以 vue3.x 提供了专门公共数据配置的方式: globalProperties getCurrentInstance,拉力进行配置

import { createApp } from 'vue'
import App from './App.vue'
const app=createApp(App)

app.config.globalProperties.$name = "karen"
app.config.globalProperties.age = "18"

app.mount('#app')

<script setup>
import Box1 from "./Box1.vue";
import Box2 from "./Box2.vue";
import {getCurrentInstance} from 'vue'
let componentsData = getCurrentInstance()
console.log(componentsData, componentsData.proxy.$name, componentsData.proxy.age);
</script>
<template>
  <div>
    <Box1></Box1>
    <Box2></Box2>
  </div>
</template>

<style scoped lang="scss">
</style>

<script setup>
import { getCurrentInstance } from "vue";
let box1Data = getCurrentInstance();
</script>

<template>
  <div>
    <p>{{ box1Data.proxy.$name }}</p>
  </div>
</template>


<script setup>
import { getCurrentInstance } from "vue";
let box2Data = getCurrentInstance();
</script>

<template>
  <div>
    <p>{{ box2Data.proxy.age }}</p>
  </div>
</template>


在这里插入图片描述
除了这样配置公共数据,还可以用另一种方法进行配置

main.js

import { createApp } from 'vue'
import App from './App.vue'
const app=createApp(App)
import $name from './http/$name.js'
app.use($name);
import $axios from './http/$axios'
app.use($axios)
app.mount('#app')

Box1.vue 一样的使用方法

<script setup>
import {  getCurrentInstance, ref } from "vue";
let name = getCurrentInstance()
</script>

<template>
  <div class="box2">
    <p>{{ info }}</p>
    <p>{{ age }}</p>
    <p>{{name.proxy.$name}}</p>
  </div>
</template>
<style>
.box2 {
  background-color:lightcoral;
}
</style>


$name.js

function $name(app){
	app.config.globalProperties.$name="karen"
}

export default $name;

结果是一样的

axios配置

将axios配置到公共数据里去,这样各个文件夹都可以直接访问

App.vue

<script setup>
import Box1 from "./components/Box1.vue"
</script>


<template>
	<div>
	<Box1></Box1>
	</div>
</template>

<style scoped lang="scss">

</style>

vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  server:{
    proxy: {
			'/api': {
				target: 'http://127.0.0.1:7001', 
				rewrite: (path) => path.replace(/^\/api/, '/'), 
				changeOrigin: true              
			}
		}
  }
})

main.js

import { createApp } from 'vue'
import App from './App.vue'
import axios from "axios"
const app=createApp(App)

axios.defaults.baseURL="http://127.0.0.1:5173/api"
app.config.globalProperties.$axios=axios

app.mount('#app')

Box1.vue

<template>
	<div>
		<h1>box1</h1>
    <p>{{title}}</p>
    <p>{{habiit}}</p>
    <p>{{info}}</p>
    <p>{{age}}</p>
	</div>
</template>

<script setup>
	import {onMounted,getCurrentInstance, ref} from "vue"
  let {proxy}=getCurrentInstance()
  let title = ref("")
  let habiit = ref("")
  let info = ref("")
  let age = ref("")
	onMounted(async ()=>{		
		let res=await proxy.$axios('/test')
    console.log(res)
    title.value = res.data.title
    habiit.value = res.data.habiit
    info.value = res.data.info
    age.value = res.data.age
	})
	
</script>

<style>
</style>

在这里插入图片描述

路由配置

使用思路跟之前差不多,只是语法略微有写变化

路由文件

import {
	createRouter,
	createWebHistory
} from 'vue-router'
const routes = [{
		path: '/',
		name: 'home',
		component: () => import('../views/Home.vue'),
		beforeEnter(to, from, next) {
			next()
		}
	},
	{
		path: '/car',
		name: 'car',
		component: () => import('../views/Car.vue'),
		children: [{
			path: '/car/son',
			name: 'son',
			component: () => import("../views/Son.vue")
		},{
			path: '/car/girl',
			name: 'girl',
			component: () => import("../views/Girl.vue")
		}]
	}
]
const router = createRouter({
	history: createWebHistory(),
	routes
})

export default router
<template>
  <div>
    car
    <button @click="fm">Home</button>
    <button @click="son">Son</button>
    <button @click="girl">girl</button>
    <router-view></router-view>
  </div>
</template>

<script setup>
import { useRouter } from "vue-router";
let router = useRouter();
let fm = () => {
  router.push({ path: "/", query: { name: "home" } });
};
let son = () => {
  router.push({ path: "/car/son"});
};
let girl = () => {
  router.push({ path: "/car/girl"});
};

</script>

<style>
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3.x之isRef toRefs isRef readonly 公共数据配置 axios配置 路由配置 的相关文章

  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • 如何将文本插入摩纳哥编辑器?

    我的应用程序中嵌入了摩纳哥代码编辑器 如何以编程方式在特定行上插入文本 var editor monaco editor create document getElementById container value First line n
  • 如何将变量传递给函数引用?

    在 React Native 中 当你有需要在渲染时运行并且必须传递变量的函数时 大多数人建议应该使用 onPress gt this functionName variable 然而 当处理大型列表和复杂组件时 您必须优化代码 为每个 r
  • Node.js 应用程序中的系统托盘图标

    这是我的 node js 应用程序中需要的 系统托盘图标 在应用程序工作期间更改此图标 单击图标后的菜单 创建带有登录 密码字段和确认按钮的窗口 这是我发现的 https github com appjs appjs https githu
  • 通过 HTML 将复杂变量传递给 javascript 的正确方法

    我试图摆脱使用 PHP 的 htmlentities 但我在这里停止了 但后来我想 我不做替换和检查特殊字符 而是只 JSON 整个对象 这提供了一个非常不受欢迎的结果 其中包含大量双引号 那么我应该怎么做呢 我应该为每个图像分配一个数字唯
  • jquery .load() 不起作用

    我似乎无法让 jquery 的 load 函数工作 一定是我缺少的一些简单的东西 基本上只是试图将 more html 的片段加载到 index html 中 索引 html
  • 如何在 javascript/jquery 中进行非阻塞睡眠?

    如何在 javascript jquery 中进行非阻塞睡眠 冒着从评论者那里窃取答案的风险 请使用设置超时 https developer mozilla org en US docs Web API WindowTimers setTi
  • 即使 WebPack 构建工作正常,VS Code 显示未找到模块

    我的 VS Code 说它找不到导入 即使我的 WebPack 构建仍然有效 这是进口 import as tf from tensorflow tfjs 以及来自 VS Code 的消息 找不到模块 tensorflow tfjs 您的意
  • Puppeteer 错误 错误:等待选择器超时

    目前我有一个网站 其 HTML 中有此内容 我通过检查chrome开发者工具中的元素确认了这一点 div class hdp photo carousel div class photo tile photo tile large 我直观地
  • 降低 Nodejs 服务器上的 CPU 利用率

    我正在研究降低 CPU 利用率的有趣方法 在 NodeJS 服务器上 在我的研究过程中 我发现了以下文章 http engineering linkedin com nodejs blazing fast nodejs 10 perform
  • 无需源代码即可部署网站

    我用php开发了网站 我想在没有源代码的情况下部署它 用php可以吗 我可以将网站代码转换为某种中间形式然后进行部署吗 您可以使用 Zend Guard 来编码您的代码 这样它就无法被逆向工程 http www zend com en pr
  • 我可以检测焦点来源吗? (Javascript、jQuery)

    快速提问 是否可以检测焦点是来自鼠标单击还是来自焦点事件的选项卡 我想如果没有 我将不得不在同一元素上使用单击句柄来确定源 但我更喜欢通过焦点事件的方式 Thanks Gausie 可能无法 100 工作 但如果没有直接的方法 那么你不能直
  • 如何配置 StrongLoop LoopBack MongoDB 数据源以部署到 Heroku

    我正在使用 LoopBack 版本 1 6 并使用以下数据源配置运行本地 mongoDB 服务器进行开发 mongodb defaultForType mongodb connector loopback connector mongodb
  • JavaScript 附加和前置与 jQuery 附加和前置

    QA Style 我最近读了一篇文章 里面说JavaScript已经实现了append and prepend受 jQuery 启发的方法 这对我来说是一个新知识 因为据我所知 要附加一个元素 我必须使用element appendChil
  • 有没有办法防止 neDB 集合数组中的条目重复?

    var addNewUser function id chatId db update id id push users chatId function err numAffected code after the record is up
  • Javascript onclick隐藏div

    我想使用 javascript 隐藏这个警告 div 我的 javascript 正确吗 我想在单击关闭图标时隐藏 关闭 div images close icon gif div strong Warning strong These a
  • 为什么 useState 会导致组件在每次更新时渲染两次?

    我这里有一段简单的代码 import React useState from react import styles css export default function App const number setNumber useSta
  • 包括来自raw.github.com的js

    我有一个 github com 演示页面 链接到https raw github com master file js https raw github com master file js这样我就不需要总是复制 js文件转移到gh pag
  • Dojo require,模块加载失败时连接错误

    当我尝试加载不存在的模块时 它失败并出现 404 错误 当然 我想处理此错误 但不知道如何连接到 错误 事件 根据 Dojo 文档 我应该能够使用它的微事件 API http livedocs dojotoolkit org loader
  • 尝试将 jquery 加载到 tampermonkey 脚本中

    我正在编写一个脚本 在加载登录页面时登录到我的大学网络 代码如下 UserScript name My Fancy New Userscript namespace http use i E your homepage version 0

随机推荐

  • 5分钟学会RocketMQ

    RocketMQ 简介 RocketMQ 是一个队列模型的消息中间件 具有高性能 高可用 高实时等特性 它并不支持JMS java消息服务 规范 但参考了JMS规范和kafak等的思想 Producer Consumer 队列都可以分布式
  • 吉布斯抽样

    吉布斯采样是生成马尔科夫链的一种方法 生成的马尔科夫链可以用来做蒙特卡洛仿真 从而求得一个较复杂的多元分布 吉布斯采样的具体做法 假设有一个k维的随机向量 现想要构造一条有n个样本的k维向量 n样本马尔科夫序列 那么 随机 初始化一个k维向
  • 联想拯救者笔记本加固态硬盘过程重点

    最近朋友嫌弃自己笔记本机械硬盘太慢 在我的蛊惑下买了块固态硬盘 想改善一下开机时间 本来以为很简单的事 没想到啊没想到 一 总的说一下 拯救者这款笔记本升级固态硬盘的思路 用ufi版本的U盘启动盘 我用的大白菜uefi版本 电脑的bosi下
  • vue修改图标以及项目名

    首先 打开这个文件 javascript
  • js实现图片任意拉伸_APICloud开发者进阶之路

    本文出自APICloud官方论坛 感谢论坛版主 东冥羽的分享 七牛云上传视频并截取第一帧作为视频的封面图 使用js上传 模块videoPlayer截取第一帧 有专门的截图模块 但是我使用的有点问题 可能是视频源的问题 canvas也能截取
  • VTK配置步骤(WIN7 64位 + VS2012 + VTK-5.10.1)

    前面的废话可以不看 我很啰嗦 由于项目中需要用到VTK 上周三就开始编译VTK源码 中间出现了一系列问题 首先是下载的高版本代码顺利编译后 自己新建的工程总是提示链接错误 尽管所有的库文件都加入了 还是不正确 之后下载了vtk较低版本5 8
  • 一文带你了解降压型稳压芯片原理

    一文带你了解降压型稳压芯片原理 导读 在电路系统设计中 总是离不开电源芯片的使用 林林总总的电源芯片非常多 比如传统的线性稳压器7805 低压差线性稳压器 LDO 开关型降压稳压器 Buck DCDC 等 那么它们到底有什么区别呢 Exce
  • C# 基本语法

    C 基本语法 C 是一种面向对象的编程语言 在面向对象的程序设计方法中 程序由各种相互交互的对象组成 相同种类的对象通常具有相同的类型 或者说 是在相同的 class 中 例如 以 Rectangle 矩形 对象为例 它具有 length
  • java request获取数组

    获取单一参数 String hostName request getParameter host String url request getParameter url 获取参数数组 String carrier request getPa
  • Ubuntu 16.04 搭建Hadoop环境(to be continued)

    reference 1 Ubuntu上搭建Hadoop环境 单机模式 伪分布模式 by yinlung 2 Ubuntu11 10下安装Hadoop1 0 0 单机伪分布式 3 Ubuntu上搭建Hadoop环境 单机模式 伪分布模式 by
  • 2023养老服务人才状况调查报告

    导读 本次调查内容涉及养老服务人才的基本特征 待遇和保障状况 培训状况 职业发展状况等 调查显示 养老服务人才以女性为主 各类受访者中女性占比约82 3 养老服务人才队伍年龄结构偏大 41 55岁年龄段的受访者占比56 0 56岁及以上占比
  • 安装Java (JDK16)

    本文将在win10的环境下安装jdk16 配置环境变量 1 下载JDK 1 打开官网下载最新的JDK Java SE Development Kit JDK 2 选择对应的版本 3 双击下载的exe进行安装 在安装过程中可以改变安装位置也可
  • MyBatis-Generator插入删除数据返回-2147482646

    在使用MyBatis Generator自动生成的代码进行删除数据时 deleteByPrimaryKey 方法 返回的int 值为 2147482646 正常的逻辑是成功删除返回 1 失败返回 0 未删除数据 特意去官网看了这个方法的说明
  • JAVA 数组(一维数组)

    Java 语言中提供的数组是用来存储固定大小的同类型元素 即存储同种数据类型的多个值 1 声明数组变量和数组初始化 首先必须声明数组变量 才能在程序中使用数组 语法 dataType arrayRefVar 或 dataType array
  • King's Quest【POJ 1904】【Tarjan强连通分量】

    Once upon a time there lived a king and he had N sons And there were N beautiful girls in the kingdom and the king knew
  • CNN,RNN,LSTM区别

    一 CNN 卷积神经网络 在机器学习中 卷积神经网络是一种深度前馈人工神经网络 已成功地应用于图像识别 1 卷积神经网络 是一种前馈神经网络 人工神经元可以响应周围单元 可以进行大型图像处理 卷积神经网络包括卷积层和池化层 卷积神经网络包括
  • 盒子模型大详解

    文档流 网页是一个多层结构 设置样式也是一层一层设置的 最终我们看到的是最上面的那一层 文档流就是网页最底部 我们创建的元素默认都是在文档流中创建的 元素分为两种状态 在文档流 脱离文档流 元素在文档流的特点 块元素 1 独占一行 2 宽是
  • 手机iCloud储存空间已满,怎么解决?

    最近手机总是弹出iCloud储存空间已满 升级的话得花钱 以后再说的话 总感觉有点 不安 担心自己的照片啥的会存不了 所以特意查找了这种方法 如果有出现这种情况的朋友 可以试试 1 找出iCloud空间被哪些档案塞满 iiPhone或iPa
  • Linux之mmv命令批量替换文件名(超详细-python结合mmv)

    文章目录 一 前言 二 各系统安装mmv方法 2 1 CentOS 2 2 Ubuntu And Debain 2 3 MacOS 三 使用方法 3 1 常规使用 3 1 1 常规使用示例 3 2 携带参数使用 3 2 1 携带参数使用示例
  • vue3.x之isRef toRefs isRef readonly 公共数据配置 axios配置 路由配置

    isRef toRefs toRef 参数 源对象 源对象属性 可以用来为源响应式对象上的某个 property 新创建一个 ref 然后 ref 可以被传递 它会保持对其源 property 的响应式连接 也就是说源响应式对象 toRef