Vue3学习-day4

news/2025/1/15 15:58:14/

父子通信

父传子 

App.vue 

<script setup>
// 局部组件(直接导入就能用,不用注册)import sonFirst from './components/son-First.vue'
// 父传子
// 1. 给子组件,添加属性的方式传值
// 2. 在子组件,通过 props 接收
import {ref} from 'vue'
const sum = ref(200) // 响应式值的传递
const getmore = () => {sum.value++
}
</script><template><div><h3>父组件 {{ sum }}<button @click="getmore">+1</button></h3><!-- 给子组件以添加属性的方式传值 --><son-First fruit="苹果" :sum="sum"></son-First></div>
</template>

 son-First.vue


<script setup>
// 注意:由于写了 setup,所以无法直接配置 props 选项
// 因此,此处需要借助于“编译器宏”函数接收子组件传递的值
const props = defineProps({fruit: String,sum: Number
})
console.log(props.fruit)
console.log(props.sum)
// 子组件
// import son from './components/son.vue'
// 父传子
// 1. 给子组件,添加属性的方式传值
// 2. 在子组件,通过 props 接收</script><template>
<!-- 对于 props 传递过来的数据,模板中可以直接使用 --><div class="son">子组件 - {{ fruit }}+ {{ sum }}</div>
</template><style scoped>S.son{border: 2px solid red;padding: 25px;}
</style>

 

defineProps原理 

 

子传父 

 

App.vue 

<script setup>
// 局部组件(直接导入就能用,不用注册)import sonFirst from './components/son-First.vue'
// 父传子
// 1. 给子组件,添加属性的方式传值
// 2. 在子组件,通过 props 接收// 子传父
// 1. 在子组件中,emit 触发事件 (编译器宏获取)
// 2. 在父组件,通过 @ 监听
import {ref} from 'vue'
const sum = ref(200) // 响应式值的传递
const getmore = () => {sum.value++
}
const changefn = (newsum) => {sum.value = newsum
}
</script><template><div><h3>父组件 {{ sum }}<button @click="getmore">+1</button></h3><!-- 给子组件以添加属性的方式传值 --><son-Firstfruit="苹果":sum="sum"@changenum="changefn"></son-First></div>
</template>

  son-First.vue


<script setup>
// 注意:由于写了 setup,所以无法直接配置 props 选项
// 因此,此处需要借助于“编译器宏”函数接收子组件传递的值
const props = defineProps({fruit: String,sum: Number
})
console.log(props.fruit)
console.log(props.sum)
// 子组件
// import son from './components/son.vue'
// 父传子
// 1. 给子组件,添加属性的方式传值
// 2. 在子组件,通过 props 接收// 子传父
// 1. 在子组件中,emit 触发事件 (编译器宏获取)
// 2. 在父组件,通过 @ 监听
const emit = defineEmits(['changenum'])const subnum = () => {// 需要 emit 触发事件emit('changenum', 5)
}
</script><template>
<!-- 对于 props 传递过来的数据,模板中可以直接使用 --><div class="son">子组件 - {{ fruit }}+ {{ sum }}<button @click="subnum">-1</button></div>
</template><style scoped>S.son{border: 2px solid red;padding: 25px;}
</style>

总结 

模板引用

模板引用的概念 

如何使用(以dom为例) 

App.vue 

<script setup>
import TextCom from '@/components/textCom.vue'
import {onMounted, ref} from 'vue'
// 模板引用(可以获取dom,也可以获取组件)
//  1. 调用ref函数,生成一个对象
//  2. 通过ref标识,进行绑定
//  3. 通过ref对象.value即可访问到绑定的元素(必需渲染完成后才能拿到)
const inp = ref(null)
// console.log(inp.value)
onMounted(() => {// console.log(inp.value)// inp.value.focus() // 聚焦
})
const clickFn = () => {inp.value.focus()
}// ----------------------------------------------
const textRef =  ref(null)
const getCom = () => {console.log(textRef.value)
}
</script>
<template><div><input ref="inp" type="text"><button @click="clickFn">通过点击按钮聚焦</button><TextCom ref="textRef"></TextCom><button @click="getCom">获取组件</button></div>
</template>
<style scoped></style>

 

defineExpose() 

 

textCom.vue 

<script setup>const count = 99999
const hello = () => {console.log('你好啊,世界')
}// defineExpose 编译宏,指定哪些属性和方法允许访问
defineExpose({count,hello
})
</script><template><div>我是测试组件 - {{ count }}</div>
</template>

App.vue 

<script setup>
import TextCom from '@/components/textCom.vue'
import {onMounted, ref} from 'vue'
// 模板引用(可以获取dom,也可以获取组件)
//  1. 调用ref函数,生成一个对象
//  2. 通过ref标识,进行绑定
//  3. 通过ref对象.value即可访问到绑定的元素(必需渲染完成后才能拿到)
const inp = ref(null)
// console.log(inp.value)
onMounted(() => {// console.log(inp.value)// inp.value.focus() // 聚焦
})
const clickFn = () => {inp.value.focus()
}// ----------------------------------------------
const textRef =  ref(null)
const getCom = () => {console.log(textRef.value.count)textRef.value.hello()
}
</script>
<template><div><input ref="inp" type="text"><button @click="clickFn">通过点击按钮聚焦</button><TextCom ref="textRef"></TextCom><button @click="getCom">获取组件</button></div>
</template>
<style scoped></style>

总结 

 


http://www.ppmy.cn/news/1563356.html

相关文章

milvus过滤功能

数据格式: [{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},{"id": 1, "vecto…

在 WSL 中使用 Jupyter Notebook 的 TensorBoard 启动问题与解决方法

在 WSL&#xff08;Windows Subsystem for Linux&#xff09;环境中&#xff0c;通过 Jupyter Notebook 使用 %tensorboard --logdir outputs有时会出现 “Timed out waiting for TensorBoard to start” 错误。常见原因通常是先前的 TensorBoard 进程尚未结束&#xff0c;占用…

摄像头开发新品种观鸟技术

摄像头工业产品的开发是一个复杂且精细的过程&#xff0c;涉及多个环节和技术领域。以下是对摄像头工业产品开发流程的详细分析&#xff1a; 一、前期准备 1. **市场调研**&#xff1a;了解市场需求、竞争对手的产品特点和市场占有率&#xff0c;以及潜在用户的使用习惯和需求…

Java-数据结构-栈与队列(常考面试题与单调栈)

在上一篇的学习中&#xff0c;我们学习了栈和队列的基本知识&#xff0c;以及它们对应都有哪些方法&#xff0c;在什么应用场景下如何使用&#xff0c;并且还对它们进行了模拟实现&#xff0c;而其实对于栈和队列的相关知识还远不止于此&#xff0c;而今天我们就对栈与队列进行…

C++内存泄露排查

内存泄漏是指程序动态分配的内存未能及时释放&#xff0c;导致系统内存逐渐耗尽&#xff0c;最终可能造成程序崩溃或性能下降。在C中&#xff0c;内存泄漏通常发生在使用new或malloc等分配内存的操作时&#xff0c;但没有正确地使用delete或free来释放这块内存。 在日常开发过程…

【python爬虫入门教程13--selenium的自动点击 --小小案例分享】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 《python爬虫入门教程12--selenium的安装与使用》 selenium就是一个可以实现python自动化的模块&#xff0c;上次我们更新了如何安装以及它的语法。同时我也更新了如何用爬虫…

vscode支持ssh远程开发

文章目录 一、生成ssh使用的公钥/密钥对二、使用vscode通过ssh连接服务器1.安装插件2.配置文件3.连接服务器4.新建文件夹&#xff0c;存放不同的任务5.为不同的项目选择不同的conda环境 三、使用scp命令与服务器互传文件、文件夹1.检查Windows 系统是否支持scp命令2.在Windows系…

Python----Python爬虫(Scrapy的应用:CrawlSpider 使用,爬取小说,CrawlSpider版)

一、CrawlSpider 使用 1.1、CrawlSpider CrawSpiders 是 Scrapy 框架中的一个特殊爬虫类&#xff0c;它用于处理需要跟随链接并抓取多个页面的情况。相比于基本的 Spider 类&#xff0c;CrawSpiders 提供了一个更灵活、更强大的方式来定义爬取规则。 在Scrapy中Spider是所有爬…