Vite+Vue3项目实战:组件化开发与通信指南

news2025/1/2 0:18:35

一、典型的Vite+Vue3项目结构

续上文成功创建Vue3项目的脚手架,通过visual Studio Code软件打开刚刚创建的文件夹,将会看到这样一个项目结构。

使用Vite构建Vue3项目时,项目结构通常遵循一定的组织规则,以保持代码的清晰和可维护性。以下是一个典型的Vite+Vue3项目结构分析: (部分省略)

补充说明:
①'index.html': 项目的入口HTML文件,其中包含一些基本的HTML结构和用于挂载Vue应用的‘’<div  id="app"></div>‘’元素
②router': 路由配置目录,通常包含一个`index.ts`文件,用于设置路由规则
③' store': 状态管理目录,通常包含一个`index.ts`文件,用于配置Vuex或Pinia等状态管理库
 

二、单组件开发

1、概述:

单组件开发是指在前端框架Vue.js中,将一个Vue组件的模板、逻辑和样式封装在一个单独的文件中进行开发的方式。这种文件通常以'.vue'为后缀,因此也常被称为单文件组件(Single File Component,简称SFC)。

2、在单组件开发中,一个组件通常包含以下三个部分:

(1) <template>:

这部分定义了的HTML结构,也就是组件的外观。

(2) '<script>':

这部分包含了组件的JavaScript逻辑,定义了组件的行为和数据

(3)'<style>':

这部分写明了组件的样式。通过添加`scoped`属性,可以确保这些样式仅应用于当前组件,避免样式冲突。

3、代码示例:

<script setup>
   import { reactive } from "vue";
   import Header from "./components/Header.vue";
   import Footer from "./components/Footer.vue";
   import Nav from "./components/Nav.vue";
   const propStudent = {
        name: "李雷",
        age: 19,   
   }
   const propTeacher = reactive( {
        name: "韩梅梅",
        age: 25,   
   })
   const addTeacherAge = () => {
        propTeacher.age ++ 
        console.log(`教师年龄为${propTeacher.age}`);      
   }
</script>

<template>
    <!-- 实验一: 在父组件里,设置子组件的“字符串型”属性(进而用于父组件向子组件传递数据) -->
    <Header propName="王五" propAge="21"  />
    <!-- 实验二: 在父组件里,设置子组件的“对象型”属性(进而用于父组件向子组件传递数据)-->
    <Nav v-bind="propStudent"  />
    <!-- 实验二: 在父组件里,设置子组件的“响应型”属性(进而用于父组件向子组件传递数据) -->
    <Footer v-bind="propTeacher"  />
    <button v-on:click="addTeacherAge">在父组件中增加教师年龄</button>
</template>

<style scoped>

</style>

三、父组件向子组件传递数据

1、概述:

父组件向子组件传递数据是组件化编程中的一种常见操作,它允许父组件将与子组件有关的信息或数据通过特定的属性(称为props)传递给子组件。这种方式保证了组件之间的数据传递是清晰定义和可维护的,同时也遵循了单向数据流的设计原则,即数据总是从父组件流向子组件,子组件不允许直接修改这些props的值,而是通过事件向上反馈信息,由父组件来决定是否及如何更新数据。

2、父组件向子组件传递数据的过程通常涉及以下步骤:

(1)定义Props: 父组件在其子组件标签上定义一些属性,并将数据作为这些属性的值传递。

(2)接收Props: 子组件在其定义中声明接收这些属性,并在其内部通过'props'对象访问这些数据。

3、示例1:

(1)父组件(App.vue)

<!-- 父组件的模板 -->
<template>
  <div>
    <child-component :message="helloMessage" />
  </div>
</template>

<script>
import ChildComponent from './components/Header.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      helloMessage: 'Hello from Parent!'
    };
  }
}
</script>

在上述代码中,':message="helloMessage"'是一个prop绑定,它将父组件中的'helloMessage'数据传递给'ChildComponent'。

(2)子组件(Header)

<!-- 子的模板 -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: ['message']
}
</script>

在子组件中,'props: ['message']'声明了子组件期望从父组件接收一个名为'message'的prop,然后可以在模板中使用这个prop显示数据。 

运行结果:

4、示例2

(1)父组件(App.vue)

<!-- 父组件的模板 -->
<template>
  <div>
    <Header :propName="userName" :propAge="userAge" />
  </div>
</template>
<script setup>
import Header from './components/Header.vue';
const userName = '王晓';
const userAge = 19;
</script>

注释:

①'<template>' 标签:这是Vue组件的模板部分,它定义了组件的结构和HTML标记。 

② '<Header :propName="userName" :propAge="userAge" />':这行代码是在父组件中使用了子组件'Header'。'Header'组件通过props(属性)接收数据。这里有两个属性绑定:
  ':propName="userName"':这是一个prop绑定,'propName'是子组件'Header'中定义的一个prop名称,它被绑定到父组件中的'userName'变量。这里的`userName`的值是字符串`'王晓'`。
  ':propuserAge"':这是另一个prop绑定,'propAge'是子组件'Header'中的另一个prop名称,它被绑定到父组件中的'userAge'变量。这里的'userAge'的值是数字'19'。

 ③'import Header from'./components/Header.vue';':这行代码导入了名为'Header'的子组件,它位于当前目录下的'components'文件夹中,并且文件名为'Header.vue'。

④ 'const userName = '王晓';'和'const userAge = 19;':这两行代码定义了一个名为'userName'和'userAge'的常量,并赋值为字符串“王晓”和数字'19'。

 (2)子组件(Header.vue)

<!-- 子的模板 -->
<template>
    <div>
        <h3>示例2</h3>
<p>{{propName}}</p >
<p>{{propAge}}</p >
    </div>
</template>
<script setup>
    const props = defineProps(
        ["propName", "propAge"]
    )
    console.log(props);
</script>
<style scoped>
    div {
        width:25%;
    }
</style>

注释:

①<p>{{propName}}</p>和<p>{{propAge}}</p>是段落元素,其中的{{propName}}和{{propAge}}是一个绑定表达式,用于显示传递给组件的propName属性的值和用于显示传递给组件的propAge属性的值

②const props = defineProps(["propName", "propAge"]) : 使用defineProps定义了组件的两个属性:propName和propAge。 console.log(props): 在控制台打印出传递给组件的props对象,这将包含propName和propAge属性及其值

③这个组件在接收了propName和propAge后,会将这些值显示在页面上,并在控制台输出这些属性的当前值。 

运行结果:

控制台: 

四、子组件向父组件传递数据

1、概述:

在Vue中,子组件向父组件传递数据通常是通过自定义事件来实现的。这种机制允许子组件在其内部状态发生变化时通知父组件父组件可以监听这些事件并响应

2、实现步骤:

(1) 父组件在引用子组件的时候,绑定一个自定义事件监听器
(2)子组件通过'$emit'方法触发这个自定义事件,并将需要传递的数据作为参数传递给父组件
(3)父组件在自定义事件的监听器中接收这些数据,并可以根据这些数据更新自身的状态

3、子组件(Header.vue)

<template>
  <div>
    <button @click="sendMessageToParent">发送数据到父组件</button>
  </div>
</template>

<script setup>
import { defineEmits } from 'vue';

// 定义一个自定义事件及其可以接收的参数类型
const emit = defineEmits(['messageFromHeader']);

// 方法用于在点击按钮时触发自定义事件,并传递数据
function sendMessageToParent() {
  const message = 'Hello from Header!';
  emit('messageFromHeader', message);
}
</script>

注释:

(1)'<template>'部分定义了子组件的HTML结构。包含了一个按钮'<button>',用户点击这个按钮将会发送数据到父组件。

(2)'<script setup>' 部分定义了子组件的逻辑。
  ① 引入了'defineEmits'函数,用于定义组件可以触发的事件以及这些事件可以接收的参数类型。
  ②使用'defineEmits'定义了一个名为'messageFromHeader'的自定义事件。
  ③ 定义了一个名为'sendMessageToParent'的函数,当按钮被点击时触发。函数内部创建了一个字符串'message',并通过'emit'函数触发'messageFromHeader'事件,将字符串作为参数传递给父组件。

4.父组件(App.vue) 

<template>
  <div>
    <Header @messageFromHeader="handleMessageFromHeader" />
    <p>从子组件接收到的消息:{{ message }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import Header from './components/Header.vue';

// 用于接收子组件传递的数据
const message = ref('');

// 事件处理器,用于处理子组件发来的消息
function handleMessageFromHeader(msg) {
  message.value = msg;
}
</script>

注释:

(1)'<template>' 部分定义了组件的HTML结构。
   - 包含了一个'<Header>'组件的标签,用于引入子组件。
   - 有一个段落'<p>'用于显示从子组件接收到的消息。
   - 使用了'{{ message }}'来绑定父组件中的'message'数据,以便动态显示。

2. '<script setup>'部分,用于定义组件的逻辑。
   - 引入了'ref'函数,它用于创建响应式数据。
   - 引入了'Header'组件,它位于'./components/Header.vue'路径下。
   - 定义了一个名为'message'的响应式数据,初始值为空字符串。
   - 定义了一个名为'handleMessageFromHeader'的事件处理器函数,它用于接收子组件传递的数据。函数将接收到的消息'msg'赋值给'message',从而更新显示的内容。

运行结果:

小结实现步骤:

1. 父组件通过('<Header>')标签引入子组件,并监听子组件发出的('messageFromHeader')事件。
2. 父组件定义了一个事件处理器('handleMessageFromHeader')来接收从子组件传递的数据,并将其存储在响应式数据('message')中。
3. 子组件定义了一个按钮,当用户点击按钮时,执行('sendMessageToParent')函数。
4. ('sendMessageToParent')函数通过('emit')函数触发('messageFromHeader')事件,并将要发送的消息作为参数传递。
5. 当父组件监听到('messageFromHeader')事件时,执行('handleMessageFromHeader')函数,更新显示从子组件接收到的消息。

 五、跨组件通信

1、概述:

在Vue框架中,跨组件通信指的是组件之间进行数据和方法传递的过程,特别是当这些组件不是简单的父子关系时。Vue中的跨组件通信是为了在组件之间共享数据和状态实现复杂的交互逻辑,从而构建更加灵活和可维护的前端应用程序。

2、常见的跨组件通信方式

(1) Props 和 Events

这是 Vue 中最常用的父子组件通信方式 。 父组件通过 props 向子组件传递数据 , 子组件则可以通过自定义事件 ( $ emit ) 向父组件发送消息 。代码示例:

①App.vue部分
<template>
  <div>
    <h1>父组件</h1>
    <Headercomponents :some-prop="message" @some-event="handleEvent" />
  </div>
</template>

<script>
import Headercomponents from './components/Header.vue';

export default {
  components: {
    Headercomponents
  },
  data() {
    return {
      message: 'Hello from Parent Component!'
    };
  },
  methods: {
    handleEvent(data) {
      console.log('Event received from Header:', data);
    }
  }
}
</script>
 ②Header.vue
<template>
  <div>
    <h2>子组件</h2>
    <p>{{ someProp }}</p>
    <button @click="sendMessageToParent">Send Message to Parent</button>
  </div>
</template>

<script>
export default {
  props: {
    someProp: String
  },
  methods: {
    sendMessageToParent() {
      this.$emit('some-event', 'Hello from Header Component!');
    }
  }
}
</script>

注释:

在这个示例中:

- 父组件通过`<Headercomponents :some-prop="message" ...>`向子组件传递了一个名为`someProp`的prop,其值为`message`。
- 子组件在其`props`定义`中接收了`someProp`,并在模板中显示它。
- 子组件有一个按钮,当点击按钮时,会通过`this.$emit('some-event', 'Hello from Header Component!')`向父组件发送名为`some-event`的事件,并传递了一条消息。
- 父通过`@some-event="handleEvent"`监听这个事件,并在`handleEvent`方法中处理它,打印从子组件接收到的消息。

运行结果:

 (2) Provide / Inject  :

Vue 提供了一个 provide/inject 机制 , 允许祖先组件通过 provide 选项提供数据或方法 , 而任何后代组件都可以通过 inject 选项来接收这些数据或方法 , 无论组件层次结构有多深 。代码示例:

①App.vue部分
<script setup>
  import { provide, ref } from 'vue'
  import Header from "./components/Header.vue"
  /*
    provide用于某个上层组件将数据广播给所有下层组件。
    若使用了provide和inject来进行数据传递,则一般不需要再使用defineProps
  */
  //【实验1】某个上层组件向所有下层组件广播普通数据
  const web =  {name:"百度一下", url:"www.baidu.com"}
  provide("provideWeb", web)
  //【实验2】某个上层组件向所有下层组件广播响应式数据
  const user = ref(0)
  provide("provideUser",user)
  //【实验3】某个上层组件向所有下层组件广播函数
  const userAdd = () => {
    user.value++
  } 
  provide("provideFuncUserAdd",userAdd)
</script>

<template>
  <h3>我是上层的App组件, 用户数为: {{ user }}</h3>
  <Header/>
</template>

<style scoped></style>
②Nav.vue部分
<script setup>
    import { inject } from 'vue'
    //【实验1】下层组件通过inject注入上层App组件广播的普通数据
    const web = inject("provideWeb")
    console.log("provideWeb:", web)
    //【实验2】下层组件通过inject注入上层App组件广播的函数
    const funcUserAdd = inject("provideFuncUserAdd")
    console.log("provideFuncUserAdd:", funcUserAdd)
    //【实验3】下层组件通过inject注入上层Header组件广播的普通数据
    const url = inject("provideUrl")
    console.log("provideUrl:", url)
</script>

<template>
    <h3>我是底层的Nav组件</h3>
    <button @click="funcUserAdd">添加用户</button>
</template>

<style scoped></style>
③ Header.vue部分
<script setup>
    import { provide, inject } from 'vue'
    import Nav from "./Nav.vue"
    //【实验1】下层组件通过inject注入上层App组件广播的响应式数据
    const user = inject("provideUser")
    console.log("provideUser:", user.value)
    //【实验2】某个上层组件向所有下层组件广播函数
    const str = "www.xiaomi.com"
    provide("provideUrl", str)
</script>

<template>
    <h3>我是中间的Header组件</h3>
    <Nav/>
</template>

<style scoped></style>

 六、插槽

1、概述:

在Vue中,插槽(Slots)是一种用于组合组件的机制,它允许父组件向子组件内部传递内容,而无需担心子组件的内部实现细节。简单来说,插槽就是子组件中用来嵌入父组件内容的占位符。 

2、主要有以下几种类型:

(1)匿名插槽(默认插槽):

 匿名插槽是插槽的基本形式,没有特定的名字。当父组件在子组件标签内部插入内容时,这些内容会被填充到子组件内部的匿名插槽中

(2)具名插槽:

 具名插槽具有特定的名字,父组件可以根据这个名字将内容插入到指定的位置。在一个子组件内部,可以通过`<slot>`标签定义具名插槽,并为其指定一个名字。

(3)作用域插槽:

作用域插槽允许父组件接收子组件传递的数据,并在父组件中可以使用这些数据。通常用于列表渲染等场景,使得父组件可以访问子组件的数据。

3、代码示例:

(1)匿名插槽(默认插槽):

①App.vue部分
<template>
  <div>
    <Card>
      <p>这是自定义的内容(会被默认插入默认插槽)</p>
      <!-- 【实验1】把代码片段插入默认插槽,可以不使用<template>标签封装 -->
      <h3>插入默认插槽的三级标题</h3>
    </Card>
  </div>
</template>

<script setup>
  import Card from './components/Card.vue';
</script>
② Card.vue 部分
<template>
  <div>
    <!-- 定义一个默认插槽(不需要命名) -->
    <div class="default-slot">
      <slot></slot>
    </div>
  </div>
</template>

<script setup></script>

<style>
  .default-slot{
    background-color: antiquewhite;
  }
</style>

运行结果:

(2)具名插槽:

①App.vue部分
<template>
  <div>
    <Card>
      <!-- 【实验】把代码片段插入具名插槽,必须使用<template>标签封装,并且用v-slot:指定插槽的名字,v-slot:简写形式为# -->
      <template v-slot:footer>
        <button @click="handleClick">我是插入具名插槽的按钮</button>
      </template>
    </Card>
  </div>
</template>

<script setup>
  import Card from './components/Card.vue';
  const handleClick = () => {
    alert('插入具名插槽的按钮被点击了!');
  };
</script>
② Card.vue 部分
<template>
  <div>
    <!-- 定义一个具名插槽(需要通过name命名,最常用) --> 
    <div class="named-slot">
      <slot name="footer"></slot>
    </div> 
  </div>
</template>

<script setup></script>

<style>
  .named-slot{
    background-color: gainsboro;
  }
</style>

运行结果:

(3)作用域插槽:

①App.vue部分
<template>
  <div>
    <Card>
      <!-- 【实验】作用域插槽:子组件将url和title数据配置到 name="user" 的插槽中,
       当父组件将某个片段插入该插槽时,便可通过 v-slot:user="data" (data是随便取的名字) 来接收这些数据-->
      <template v-slot:user="data">  
        子组件通过作用域插槽传来的数据: {{ data.url }} , {{ data.title }}
      </template>  
    </Card>
  </div>
</template>

<script setup>
  import Card from './components/Card.vue';
  const handleClick = () => {
    alert('插入具名插槽的按钮被点击了!');
  };
</script>
② Card.vue 部分
<template>
  <div>
    <!-- 定义一个作用域插槽(需要通过name命名,所以它也是具名插槽的一种,但要求在插槽里配置一些数据) -->
    <div class="scoped-slot">
      <slot name="user" url="www.baidu.com" title="百度一下"></slot>
    </div>
  </div>
</template>

<script setup></script>

<style>
  .scoped-slot{
    background-color: pink;
  }
</style>

运行结果;

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

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

相关文章

Html笔记()蜘蛛纸牌之卡牌吸附

目的 蜘蛛纸牌中要实现牌组的连接&#xff0c;就需要吸附功能。从效果图中可以看出我们把一张牌拖到另一张卡牌上的时候&#xff0c;它会自动吸附过去并且左对齐。 效果 代码 <!DOCTYPE html> <html><head><style>body {display: flex;justify-cont…

CDC YAML 在阿里云的最佳实践

摘要&#xff1a;本文投稿自阿里云开源大数据平台数据通道团队&#xff0c;主要介绍了 Flink CDC YAML 在实时计算Flink版的最佳实践。内容分为以下五个部分&#xff1a; CDC YAML 简介CDC YAML 核心能力CDC YAML 应用场景阿里云 Flink CDC 企业级功能十分钟在阿里云免费实现一…

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和pe…

Cursor vs VSCode:主要区别与优势分析

Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成&#xff1a; # Cursor可以直接通过快捷键调用AI # 例如&#xff1a;按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里&#xff0c;你可以直接询问AI如何实现功能# AI会直接在编辑器中…

利用 360 安全卫士极速版关闭电脑开机自启动软件教程

在使用电脑的过程中&#xff0c;过多的开机自启动软件会严重拖慢电脑的开机速度&#xff0c;影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件&#xff0c;让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…

电子信息工程自动化 基于单片机的居室安全报警系统

摘要 本课题设计了基于STM32F103C6T6单片机为主控核心的居室安全报警系统。为了解决家庭居室的安全监控&#xff0c;通过温湿度芯片SHT30、烟雾传感器MQ-2、天然气传感器MQ-4来获取居室的温湿度、烟雾、天然气含量&#xff0c;使用了一个热释电传感器、菲涅耳透镜、红外传感信…

2025年的预测:从扩容到隐私的Web3全景图

2025年&#xff0c;Web3领域将迎来更多技术突破与创新应用。从扩容技术的蓬勃发展到隐私保护的「ChatGPT时刻」&#xff0c;区块链生态正在逐步完善和扩展。这篇文章基于Equilibrium的年度预测报告&#xff0c;梳理了Web3在未来一年的关键趋势&#xff0c;提供了一幅从扩容到隐…

挑战用React封装100个组件【010】

Hello&#xff0c;大家好&#xff0c;今天我挑战的组件是这样的&#xff01; 今天这个组件是一个打卡成功&#xff0c;或者获得徽章后的组件。点击按钮后&#xff0c;会弹出礼花。项目中的勋章是我通过AI生成的&#xff0c;还是很厉害的哈&#xff01;稍微抠图直接使用。最后面…

解决Windows与Ubuntu云服务器无法通过Socket(udp)通信问题

今天在写Socket通信代码的时候&#xff0c;使用云服务器自己与自己通信没有问题&#xff0c;但是当我们把客户端换为Windows系统的时候却无法发送信息到Linux当中&#xff0c;耗时一上午终于搞定了&#x1f612;。 问题&#xff1a; 如上图&#xff0c;当我在windows的客户端…

MYSQL - 索引详解

一 什么是索引&#xff1f; 实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点&#xff0c;在引擎层&#xff0c;我们提到不同的引擎对应的索引的实现方式&#xff0c;选择是不一样的。 简单理解&#xff0c;索引&#xff08;index&#xff09;其实就是一种帮助MYSQL高…

美联众合,24H京西宠物医院,魏燕庸医误诊

16 骚饼发布了一篇小红书笔记&#xff0c;快来看吧&#xff01; &#x1f606; 5srdmSgkXxTDw8w &#x1f606; http://xhslink.com/a/3N7dcpgca470&#xff0c;复制本条信息&#xff0c;打开【小红书】App查看精彩内容&#xff01; 魏燕 在猫咪血常规指标&#xff1a;TP总蛋白…

outlook软件配置邮箱提示“到邮件服务器的加密连接不可用”

outlook软件配置邮箱提示“到邮件服务器的加密连接不可用” 问题描述&#xff1a; outlook软件里邮箱提示“已断开”或配置邮箱时提示“到邮件服务器的加密连接不可用”。 解决方案&#xff1a; 一、更改注册表&#xff08;可先导出备份&#xff09; winr&#xff0c;输入re…

【求助】Tinymce组件异常

版本号 { "tinymce/tinymce-vue": "^3.0.1", "tinymce": "^5.10.9", "vue": "^2.6.10", }问题&#xff1a; 就是红框处点击后没有菜单出现&#xff0c;下面是正常的

Y20030002 微信+Java+Jsp+Servlet+MySQL的问卷调查小程序的设计与实现 源代码 配置文档 全套资料

问卷调查微信小程序 1.摘要2. 系统开的背景和意义3. 国内外研究现状4. 系统功能5.界面展示6.源码获取 1.摘要 摘 要&#xff1a;本文深入研究并实现了一个基于微信小程序的问卷调查系统。微信小程序问卷调查系统借助于微信小程序的便捷性和普及性&#xff0c;为用户提供了一个…

Java 导出Excel高亮

Java 导出Excel高亮 1 依赖2 代码结果 1 依赖 <!-- hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.34</version> </dependency><!-- Apache POI 主库 …

LabVIEW气缸摩擦力测试系统

基于LabVIEW的气缸摩擦力测试系统实现了气缸在不同工作状态下摩擦力的快速、准确测试。系统由硬件平台和软件两大部分组成&#xff0c;具有高自动化、精确测量和用户友好等特点&#xff0c;可广泛应用于精密机械和自动化领域。 ​ 项目背景&#xff1a; 气缸作为舵机关键部件…

SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决

概述 在 SwiftUI 的界面布局中&#xff0c;列表&#xff08;List&#xff09;和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道&#xff1a;如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到&#xff1a;当在 List 的…

ansible基础教程(下)

一、playbook 简介&#xff1a; playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。 通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。 使用场景&#xff1a; 像执行shell命令与写…

华为网络设备配置文件备份与恢复(上传、下载、导出,导入)

在日常运维工作中&#xff0c;会经常存在网络割接的情况&#xff0c;为了保证网络割接失败时能重新回退至原有配置&#xff0c;从而不影响原有的办公环境&#xff0c;在网络割接前的备份工作就非常有必要了。 备份方式&#xff1a;FTP 备份技术&#xff1a;PC客户端<---&g…

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…