【Vue-vue基础知识】学习笔记

news2025/4/16 16:59:20

目录

  • <<回到导览
  • vue基础知识
    • 1.1.创建一个vue实例
    • 1.2.vue基础指令
      • 1.2.1.v-bind
      • 1.2.2.v-model
      • 1.2.3.常用事件
      • 1.2.4.指令修饰符
    • 1.3.计算属性
      • 1.3.1.计算属性的完整写法
      • 1.3.2.【案例】成绩
    • 1.4.watch
      • 1.4.1.watch属性
      • 1.4.2.翻译业务实现
      • 1.4.3.watch属性的完整写法
      • 1.4.4.【案例】水果购物车
    • 1.5.生命周期
      • 1.5.1.【应用】初始化渲染
      • 1.5.2.【应用】获取焦点

<<回到导览

vue基础知识

mvvm模型

响应式数据,一旦数据变化,视图效果跟着变化

1.1.创建一个vue实例

  • 代码:

     <!-- 1.准备容器 -->
      <div id="app">{{msg}}{{age-1}}</div>
    
      <!-- 2.引入开发版本的包 -->
      <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
    
      <script>
        // 3.创建实例
        const app = new Vue({
          // 4.添加配置项
          el: '#app',// el => 挂载
          data: {
            msg: 'hello',
            age: 18
          }
        })
    
  • 插值表达式

    {{}}包裹变量名,将表达式插值,如上面{{msg}}和{{age-1}},浏览器会分别渲染值hello和 17

  • 响应式特性

    响应式:数据变化,视图自动更新,当我们修改数据后,vue会监听到数据修改,从而改变视图

    data里的数据会添加到实例身上,以上面实例为例子,我们可以通过app访问属性msg和age
    在这里插入图片描述)

1.2.vue基础指令

  • 一些基础指令:

        <!-- 1.v-html  =>  innerHtml   -->
        <div v-html="msg2"></div>
    
        <!-- 2.v-show  =>  通过display来显示和隐藏  =>  一般用于交互频繁  -->
        <div v-show="flag3">333</div>
    
        <!-- 3.v-if  =>   条件渲染                 =>  用于交互不频繁    -->
        <div v-if="flag3">444</div>
    
        <!-- 4.v-if、 v-else-if   v-else          =>   条件渲染  -->
    
        <!-- 5.v-on 注册事件  每点击一下,count -1 -->
        v-on:click="count--"   =>   @click="count--" 
    
  • methods属性(用于存放事件方法)

    <!-- 点击按钮,调用methods方法,弹出提示框 -->
    <button @click="methods">methods</button>
    
    <!-- js -->
    methods: {
        methods() {
            alert('methods')
        }
    }
    
  • 7.v-for(基于数组循环,多次渲染整个元素,v-for="(item,index) in arr

    <!-- 编号arr中的项,并且列举 -->
    <li v-for="(item, index) in list">{{index+1}}.{{item}}</li>
    

    v-for中的key:给元素添加唯一标识,用于列表项的正确排序(key值必须具有唯一性,不推荐以index作为key值)

1.2.1.v-bind

  • 可省略成: ,用于实现熟悉的响应式

      <!-- imgUrl为配置项中data中的数据 -->
      <img v-bind:src="imgUrl">
      
      <!-- 等价为 -->
      <img :src="imgUrl" alt="">
    

    v-bind可以操作class

    1. 传对象

      应用场景:一个类名,来回切换(tab栏)

      <!-- size、pink、green都为类名 -->
      <div class="box" :class="{size:true,pink:false,green:true}">123</div>
      
  1. 传数组

    应用场景:批量添加或者删除类

    <div class="box" :class="['pink','size']">223</div>
    
  2. style行内样式

    应用场景:非常方便地控制某个样式属性的变化(进度条),数值拼接单位

    <div class="box" :style="{'background-color':'green'}"></div>
    

1.2.2.v-model

v-modal 可以让数据和视图双向绑定,快速获取或者设置表单元素内容

<!-- input框值变化,data中对应的数据也会变化 -->
<input type="text" v-model="username"><br>

对于不同的表单元素, v-modal 的绑定也有所不同

表单元素绑定备注
输入框valuetext
文本域valuetextarea
复选框checkedcheckbox
单选框checkedradio,name将单选框关联
下拉菜单selected元素中,option选项的value值selected、option

1.2.3.常用事件

事件触发
@click单击触发
v-model常用于绑定input事件
@submit表单提交触发
@mouseover鼠标悬停触发
@mouseout鼠标移开触发
  • 焦点事件

    事件触发
    @focus元素获得焦点
    @blur元素失去焦点
  • 表单事件

    事件触发
    @reset点击重置按钮时
    @submit点击提交按钮
  • 键盘事件

    事件触发
    @keydown按下任意按键。
    @keypress除 Shift、Fn、CapsLock 外的任意键被按住。
    @keyup按键弹起

1.2.4.指令修饰符

  1. 按键修饰符
    • @keyup.enter:键盘回车监听
  2. v-model修饰符
    • v-model.trim:去首尾空格
    • v-model.number:转数字
  3. 事件修饰符
    • 事件名.stop:阻止冒泡
    • 事件名.prevent:阻止默认行为
  4. 其他
    • once:事件只触发一次

1.3.计算属性

计算属性会对计算结果缓存,依赖项变了,会自动重新计算,并再次缓存,缓存可以被直接读取(性能高)

1.methods属性

<p>礼物总数:{{ total() }}</p>
<p>礼物总数:{{ total() }}</p>
<p>礼物总数:{{ total() }}</p>

 <!-- js中 -->
data: {
    list: [
    { id: 1, name: '篮球', num: 1 },
    { id: 2, name: '玩具', num: 2 },
    { id: 3, name: '铅笔', num: 5 },
    ]
},
methods: {
	total() {
        console.log("执行了一次。");
        return this.list.reduce((sum, item) => sum + item.num, 0)
	}
}
  • 控制台会打印三次"执行了一次。"
  1. computed属性
 <!-- 计算属性依旧是属性,不用加() -->
<p>礼物总数:{{ total }}</p>
<p>礼物总数:{{ total }}</p>
<p>礼物总数:{{ total }}</p>

 <!-- js中 -->
computed: {
	封装一段对于数据的处理,求得一个结果
	total() {
    	console.log("执行了一次。");
		return this.list.reduce((sum, item) => sum + item.num, 0)
	}
}
  • 控制台会打印一次"执行了一次。"

1.3.1.计算属性的完整写法

计算属性默认只能访问,不能修改,如果要修改,需要计算属性的完整写法

computed:{
    fullName(){
        return this.firstName + this.lastName
    }
}

以上写法等价于

computed:{
    fullName:{
        get(){
             return this.firstName + this.lastName
        }
    }
}
  • 上面写法只能通过监听firstName和lastName,来动态改变fullName的值
  • 现在假设fullName会变化,我们fullName变化时,有对firstName和lastName进行拆分的需求,就需要计算属性的完整写法
computed:{
    fullName:{
        // 监听firstName和lastName,动态改变fullName的值
        get(){
             return this.firstName + this.lastName
        },
        
        // 监听fullName,动态改变firstName和lastName的值
        set(value){
            this.firstName = value.slice(0,1))
            this.lastName = value.slice(1)
        }
    }
}

从上面可以看出,set方法的形参value为fullName的值

当然除了改变firstName和lastName的值,还可以做出其他的一些操作,这里就不一一例举了

1.3.2.【案例】成绩

  • 成品图
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="./styles/index.css" />
    <title>Document</title>
</head>

<body>
    <div id="app" class="score-case">
        <div class="table">
            <table>
                <thead>
                    <tr>
                        <th>编号</th>
                        <th>科目</th>
                        <th>成绩</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody v-if="list.length>0">
                    <tr v-for="(item,index) in list" :key="item.id">
                        <td>{{item.id}}</td>
                        <td>{{item.subject}}</td>
                        <td :class="{red:item.score<60}">{{item.score}}</td>
                        <td><a href="#" @click="del(item.id)">删除</a></td>
                    </tr>
                </tbody>
                <tbody v-else>
                    <tr>
                        <td colspan="5">
                            <span class="none">暂无数据</span>
                        </td>
                    </tr>
                </tbody>

                <tfoot>
                    <tr>
                        <td colspan="5">
                            <span>总分:{{total}}</span>
                            <span style="margin-left: 50px">平均分:{{average}}</span>
                        </td>
                    </tr>
                </tfoot>
            </table>
        </div>
        <div class="form">
            <div class="form-item">
                <div class="label">科目:</div>
                <div class="input">
                    <input type="text" placeholder="请输入科目" v-model="subject" />
                </div>
            </div>
            <div class="form-item">
                <div class="label">分数:</div>
                <div class="input">
                    <input type="text" placeholder="请输入分数" v-model="score" />
                </div>
            </div>
            <div class="form-item">
                <div class="label"></div>
                <div class="input">
                    <button class="submit" @click="add">添加</button>
                </div>
            </div>
        </div>
    </div>
    <script src="../../vue/vue.js"></script>

    <script>
        const app = new Vue({
            el: '#app',
            data: {
                list: [
                    { id: 1, subject: '语文', score: 20 },
                    { id: 2, subject: '数学', score: 99 },
                    { id: 3, subject: '英语', score: 70 },
                ],
                subject: '',
                score: ''
            },
            methods: {
                del(id) {
                    this.list = this.list.filter(item => item.id !== id)
                },
                add() {
                    if (!this.subject || !this.score) {
                        alert('没有输入科目或者分数!!!')
                    } else {
                        // 往数组前面加
                        this.list.unshift({
                            // 以时间戳作为id,来设置key
                            id: +new Date(),
                            subject: this.subject,
                            score: this.score
                        })
                        this.subject = ''
                        this.score = ''
                    }

                }
            },
            computed: {
                total() {
                    return this.list.reduce((sum, item) => sum + item.score, 0)
                },
                average() {
                    if (this.list.length == 0) {
                        return 0
                    } else {
                        return this.total / (this.list.length)
                    }
                }
            }
        })
    </script>
</body>

</html>

重要知识点

  1. 删除逻辑

     del(id) {
        this.list = this.list.filter(item => item.id !== id)
     },
    
    • 通过点击触发del方法,传入id
    • 通过filter,从list过滤出和被点击项的id不同的id项,重新赋值给list(即从list删除点击项)
  2. 求和逻辑

      total() {
          return this.list.reduce((sum, item) => sum + item.score, 0)
      },
    
    • reduce累加器的运用
  3. 加入数组

    • 往数组前面加:unshift()方法
    • 往数组后面加:push()方法

1.4.watch

1.4.1.watch属性

作用:监视数据变化,执行 业务逻辑 或 异步操作

watch:{
	//  该方法会在数据变化时调用执行
    // newValue新值, oldValue老值(一般不用) 
    words(newValue, oldValue) {
       console.log('变化了', newValue,, oldValue)
    }
}

以上代码监听了data里的数据words,如果我们要监听data里obj对象属性words,则应该写为 'obj.words'

 'obj.words'(newValue) {
      console.log('变化了', newValue)
 }

1.4.2.翻译业务实现

 watch: {
     'obj.words'(newValue) {  
         clearTimeout(this.timerId)
         this.timerId = setTimeout(async () => {
             const res = await axios({
                 url: 'https://applet-base-api-t.itheima.net/api/translate',
                 params: {
                     words:newValue
                 }
             })
             this.result = res.data.data
         }, 300)
     },
 }

知识点

  • 防抖处理

1.4.3.watch属性的完整写法

  • 额外配置项

    配置项效果
    deep:true深度监视,对象的子元素变化也会触发
    immediate:true初始化立即执行一次

上面的翻译业务实现还可以升级为,通过改变翻译语言也会触发watch监听

  • 对象obj有属性words和属性language
  • 对象进行深度监视,对象的任何一个属性(words和language)发生变化,都会触发重新翻译
watch: {
    obj: {
        deep: true,         // 深度监视
        immediate: true,    // 立即执行
        handler(newValue) {
            clearTimeout(this.timerId)
            this.timerId = setTimeout(async () => {
                const res = await axios({
                    url: 'https://applet-base-api-t.itheima.net/api/translate',
                    params: newValue
                })
                this.result = res.data.data
            }, 300)
      }
   },
}

1.4.4.【案例】水果购物车

  • 成品图
    在这里插入图片描述
  • js代码
const dedaultArr = [
    {
        id: 1,
        icon: 'img/火龙果.png',
        isChecked: true,
        num: 1,
        price: 6,
    },
    {
        id: 2,
        icon: 'img/荔枝.png',
        isChecked: false,
        num: 1,
        price: 20,
    },
    {
        id: 3,
        icon: 'img/榴莲.png',
        isChecked: false,
        num: 1,
        price: 40,
    },
    {
        id: 4,
        icon: 'img/鸭梨.png',
        isChecked: true,
        num: 1,
        price: 3,
    },
    {
        id: 5,
        icon: 'img/樱桃.png',
        isChecked: false,
        num: 1,
        price: 32,
    },
]
const app = new Vue({
    el: '#app',
    data: {
        // 水果列表
        bannerSrc: 'img/fruit.jpg',
        fruitList: JSON.parse(localStorage.getItem('list')) || dedaultArr
    },
    methods: {
        del(id) {
            return this.fruitList = this.fruitList.filter(item => item.id != id)
        }
    },
    computed: {
        // 计算选中个数
        totalCount() {
            return this.fruitList.reduce((sum, item) => {
                if (item.isChecked) {
                    return sum + item.num
                } else {
                    return sum
                }
            }, 0)
        },
        // 计算总价
        totalPrice() {
            return this.fruitList.reduce((sum, item) => {
                if (item.isChecked) {
                    return sum + item.num * item.price
                } else {
                    return sum
                }
            }, 0)
        },
        all: {
            get() {
                // return的值决定全选框是否勾选
                // 必须所有框都选中,全选按钮才选中(every)
                return this.fruitList.every(item => item.isChecked)
            },
            set(value) {
                // 全选按钮的value影响其他框
                this.fruitList.forEach(item => item.isChecked = value);
            }
        }
    },
    watch: {
        fruitList: {
            deep: true,
            handler(newValue) {
                localStorage.setItem('list', JSON.stringify(newValue))
            }
        }
    }
})
  • 部分html代码展示
<div class="tbody">
    <div class="tr active" v-for="(item,index) in fruitList">
        <div class="td"><input type="checkbox" v-model="item.isChecked" /></div>
        <div class="td"><img :src="item.icon" alt="" /></div>
        <div class="td">{{item.price}}</div>
        <div class="td">
            <div class="my-input-number">
                <button class="decrease" @click="item.num--"> - </button>
                <span class="my-input__inner">{{item.num}}</span>
                <button class="increase" @click="item.num++"> + </button>
            </div>
        </div>
        <div class="td">{{item.num*item.price}}</div>
        <div class="td"><button @click="del(item.id)">删除</button></div>
    </div>
</div>
 <!-- 底部 -->
<div class="bottom">
    <!-- 全选 -->
    <label class="check-all">
      <input type="checkbox" v-model="all" />
      全选
    </label>
    <div class="right-box">
	    <!-- 所有商品总价 -->
	    <span class="price-box">总价&nbsp;&nbsp;:&nbsp;&nbsp;¥&nbsp;
	      <span class="price">{{totalPrice}}</span>
	    </span>
	    <!-- 结算按钮 -->
	    <button class="pay">结算( {{totalCount}} )</button>
    </div>
</div>

知识点

  • 全选框逻辑
    在这里插入图片描述
    1. fruitList里添加属性isChecked来标记item项是否勾选
    2. 再通过v-model="item.isChecked”将isChecked和每个子checkbox绑定,即checkbox和勾选状态关联
    3. 如果子checkbox发生变化,调用get()
    4. 再通过every检查fruitList里的item.isChecked是否全为true,即检查是否全勾选
    5. 如果全勾选,返回true,通过v-model="all"反作用于全选的checkbox,使其勾选
    6. 如果全选的checkbox发生变化,调用set(),并通过形参value传入all的值
    7. 通过forEach,将所有子checkbox的isChecked设置为和all一样的值

1.5.生命周期

在不同的生命周期,会自动运行一些函数,被称为生命周期钩子,让开发者可以在特定阶段运行代码

  • 生命周期四个阶段

    1.创建阶段:创建响应式数据

    2.挂载阶段:渲染模板

    3.更新阶段:修改数据,更新视图

    4.销毁阶段:销毁Vue实例

    在这里插入图片描述

  • 生命周期钩子
    在这里插入图片描述

1.5.1.【应用】初始化渲染

created生命周期,发送获取数据的请求

const app = new Vue({
    el: '#app',
    data: {
        list: []
    },
    async created() {
        // 1. 发送请求获取数据
        const res = await axios.get('http://hmajax.itheima.net/api/news')
        // 2.将获取的数据写入数据列表
        this.list = res.data.data
    }
})
</script>

1.5.2.【应用】获取焦点

mounted生命周期,获取焦点(操作dom)

const app = new Vue({
    el: '#app',
    data: {
        words: ''
    },
    mounted() {
        document.querySelector('#inp').focus()
    }
})

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

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

相关文章

【Linux网络】网络套接字socket

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12891150.html 目录 Socket 编程预备 理解源 IP 地址和目的 IP 地址 认识端口号 端口号范围划分…

tomcat的负载均衡和会话保持

写你的想写的东西&#xff0c;写在tomcat的默认发布目录中 这里写了一个jsp的文件 访问成功 可以用nginx实现反向代理 tomcat负载均衡实现&#xff1a; 这里使用的算法是根据cookie值进行哈希&#xff0c;根据ip地址哈希会有问题.如果是同一台主机再怎么访问都是同一个ip。 t…

c++项目 网络聊天服务器 实现;QPS测试

源码 https://github.com/DBWGLX/SZU_system_programming 文章目录 技术设计编码JSON的替换Protobuf 网络线程池更高效率网络字节序的考虑send可能无法一次性发送全部数据&#xff01;EPOLLHUP , EPOLLERR 的正确处理 IO数据库操作的更高性能 开发日志2025.3a.粘包问题 2025.4b…

rnn的音频降噪背后技术原理

rnniose: 这个演示展示了 RNNoise 项目&#xff0c;说明了如何将深度学习应用于噪声抑制。其核心理念是将经典的信号处理方法与深度学习结合&#xff0c;打造一个小巧、快速的实时噪声抑制算法。它不需要昂贵的 GPU —— 在树莓派上就能轻松运行。 相比传统的噪声抑制系统&…

ubuntu 配置固定ip

在装服务器系统的时候&#xff0c;DHCP自动获取ip时&#xff0c;路由可能会重新分配ip&#xff0c;为避免产生影响&#xff0c;可以关闭DHCP将主机设置为静态ip。 系统环境 Ubuntu 22.04-Desktop 配置方式 一、如果是装的Ubuntu图形化&#xff08;就是可以用鼠标操作点击应用…

基于Coze平台实现工程项目管理SaaS软件的在线化客户服务

一、引言 在数字化转型浪潮下&#xff0c;SaaS&#xff08;软件即服务&#xff09;模式已成为企业级软件的主流交付方式。然而&#xff0c;随着用户规模的增长&#xff0c;传统人工客服模式面临响应速度慢、人力成本高、知识库更新滞后等痛点。如何利用AI技术实现客户服务的智…

批量图片文本识别重命名,批量ocr识别图片重命名,基于WPF和腾讯OCR云部署实,现批量对图片局部提取文字后重命名的操作详细步骤

​​1. 项目背景​​ 在日常工作中,我们经常需要处理大量图片文件,这些图片可能包含重要的文字信息。为了提高工作效率,我们需要一种自动化的方式,从图片中提取文字,并根据提取的文字对图片进行重命名。 本项目基于 ​​WPF​​ 框架开发桌面应用程序,结合 ​​腾讯 OCR…

Linux——冯 • 诺依曼体系结构操作系统初识

目录 1. 冯 • 诺依曼体系结构 1.1 冯•诺依曼体系结构推导 1.2 内存提高冯•诺依曼体系结构效率的方法 1.3 理解数据流动 2. 初步认识操作系统 2.1 操作系统的概念 2.2 设计OS的目的 3. 操作系统的管理精髓 1. 冯 • 诺依曼体系结构 1.1 冯•诺依曼体系结构推导 计算…

Vue3 实现进度条组件

样式如下&#xff0c;代码如下 <script setup> import { computed, defineEmits, defineProps, onMounted, ref, watch } from vue// 定义 props const props defineProps({// 初始百分比initialPercentage: {type: Number,default: 0,}, })// 定义 emits const emits…

35.[前端开发-JavaScript基础]Day12-for循环中变量-华为商城-商品列表-轮播图

for循环中监听函数中打印变量 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…

【蓝桥杯】十五届省赛B组c++

目录 前言 握手问题 分析 排列组合写法 枚举 小球反弹 分析 代码 好数 分析 代码 R 格式 分析 代码 宝石组合 分析 代码 数字接龙 分析 代码 拔河 分析 代码 总结 前言 主播这两天做了一套蓝桥杯的省赛题目&#xff08;切实感受到了自己有多菜&#x…

[Linux系统编程]多线程

多线程 1. 线程1.1 线程的概念1.2 进程与线程对比1.3 轻量级进程 2. Linux线程控制2.1 POSIX 线程&#xff08;pthread&#xff09;2.2 线程ID、pthread_t、和进程地址空间的关系2.2.1 pthread_self2.2.2 pthread_create2.2.3 pthread_join2.2.4 线程终止的三种方式2.2.5 pthre…

IntelliJ IDEA下开发FPGA——FPGA开发体验提升__下

前言 由于Quartus写代码比较费劲&#xff0c;虽然新版已经有了代码补全&#xff0c;但体验上还有所欠缺。于是使用VS Code开发&#xff0c;效果如下所示&#xff0c;代码样式和基本的代码补全已经可以满足开发&#xff0c;其余工作则交由Quartus完成 但VS Code的自带的git功能&…

odo18实施——销售-仓库-采购-制造-制造外包-整个流程自动化单据功能的演示教程

安装模块 安装销售 、库存、采购、制造模块 2.开启外包功能 在进入制造应用点击 配置—>设置 勾选外包&#xff0c;点击保存 添加信息 一、添加客户信息 点击到销售应用 点击订单—>客户 点击新建 创建客户1&#xff0c;及其他客户相关信息&#xff0c;点…

微信小程序生成某个具体页面的二维码

微信小程序&#xff0c;如果要生成某个具体页面&#xff0c;而非首页的二维码&#xff0c;体验和正式的生成方法如下&#xff1a; 1、体验版二维码&#xff1a; 管理---版本管理---修改页面路径&#xff0c;输入具体页面的路径以及参数&#xff0c;生成的是二维码 2、正式小程…

鸿蒙开发_ARKTS快速入门_语法说明_组件声明_组件手册查看---纯血鸿蒙HarmonyOS5.0工作笔记010

然后我们来看如何使用组件 可以看到组件的组成 可以看到我们使用的组件 然后看一下组件的语法.组件中可以使用子组件. 然后组件中可以有参数,来修改组件的样式等 可以看到{},这种方式可以设置组件参数,当然在下面. 的方式也可以的 然后再来

接口异常数组基础题

题目描述 设想你正在构建一个智能家居控制系统。这个系统可以连接多种不同类型的智能设备&#xff0c;如智能灯泡、智能空调和智能门锁。每种设备都有其独特的功能&#xff0c;不过它们也有一些通用的操作&#xff0c;像开启、关闭和获取设备状态等。系统需要提供一个方法来控…

rustdesk折腾手记

背景 我的工作环境&#xff1a;主力电脑是macPro, 另外一台ThinkPad W530作为开发机&#xff0c;装的是LinuxMint&#xff0c;还有一台ThinkPad P15作为服务器。平常显示器接到macPro&#xff0c;在macOS上通过微软的远程桌面连接到另外两台Linux。基本访问比较流畅&#xff0…

使用el-tab 实现两个tab切换

1、主页面 index.vue 2、tab1&#xff1a;school.vue 3、tab2&#xff1a;parent.vue 具体代码如下&#xff1a; <template><div class"app-container"><!-- 使用el-tabs 实现两个组件的切换 --><el-tabs v-model"activeName" typ…

使用Pholcus编写Go爬虫示例

想用Pholcus库来写一个Go的爬虫程序。首先&#xff0c;我得确认Pholcus的当前状态&#xff0c;因为之前听说过它可能已经不再维护了。不过用户可能还是需要基于这个库的示例&#xff0c;所以得先提供一个基本的框架。 首先&#xff0c;我应该回忆一下Pholcus的基本用法。Pholc…