第6讲:v-for使用

目录

        1.循环遍历

        2.v-for遍历整形变量(99乘法表)

        3.v-for遍历普通数组

        4.v-for遍历数组对象

1.循环遍历

v-for指令基于一个数组渲染一个列表,它和JavaScript的遍历语法相似:
  v-for=”item in list”
  list 是一个数组, item 是当前被遍历的对象 
<ul>
      <li v-for=”item in list” v-bind:key=”item”>{{ item }}</li>
  </ul>
  在数组进行遍历时,我们必须给遍历对象绑定一个对应的 key 值以保证对象的唯一性
  使用 v-bind:key 指令进行绑定
v-for 中key的作用
1、 key的作用主要是为了高效的更新虛拟DOM,通过key可以精准判断两个节点是否是同一个,从而避免频繁更新不同元素,使得整个patch过程更加高效,减少DOM操作量,提高性能。
2、 若不设置key可能在列表更新时引发一些隐蔽的bug。如某行数据不该更新的却更新了。
3、vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

2.v-for遍历整形变量(99乘法表)

<h3 align="center">九九乘法表</h3>
<hr>
<table align="center" border="1">
    <tr v-for="i in 9" :key="i">
        <td v-for="j in i" :key="j">{{j}}*{{i}}={{i*j}}</td>
    </tr>
</table>

3.v-for遍历普通数组

语法 : v-for="(item,index) in array"

item : 数组中的每一项

index : 索引值

如果只需要第一个参数item ,index可以不写,括号可以省略

<template>
    <div>
        <h2 align="center">for语句的使用方法讲解</h2>
        <hr>
        <h4 align="left">
        <pre>
            v-for指令基于一个数组渲染一个列表,它和JavaScript的遍历语法相似:
            v-for=”item in list”
            list是一个数组,item是当前被遍历的对象

            在数组进行遍历时,我们必须给遍历对象绑定一个对应的key值以保证对象的唯一性
            使用v-bind:key指令进行绑定

        </pre>
        <ul>
            <li v-for="item in weeks" :key='item'>{{item}}</li>
        </ul>

    </div>
</template>
<script>

export default({
    name: 'ForDemo',
    data(){
        return {
            weeks:[
                "星期一",
                "星期二",
                "星期三",
                "星期四",
                "星期五",
                "星期六",
                "星期日"
            ]
        }
    }
})
</script>

  4.v-for遍历数组对象

语法 : v-for="(item,index) in array"

item : 数组中的每一项(每一个对象)

index : 索引值

如果只需要第一个参数item ,index可以不写,括号可以省略

<template>
    <div>
        <h2 align="center">for语句的使用方法讲解</h2>
        <hr>
        <h3 align="center">员工资料列表</h3>
        <table align="center" width="800px" border="1">
            <thead>
                <tr>
                    <th>员工ID</th>
                    <th>姓名</th>
                    <th>性别</th>
                    <th>年龄</th>
                </tr>
            </thead>
            <tr v-for="row in empList" :key="row.empId">
                <td>{{row.empId}}</td>
                <td>{{row.name}}</td>
                <td>{{row.sex}}</td>
                <td>{{row.age}}</td>
            </tr>

        </table>

    </div>
</template>
<script>

export default({
    name: 'For',
    data(){
        return {
            empList:[
                {empId:1,name:'张三',sex:'男',age:'18'},
                {empId:2,name:'李四',sex:'男',age:'28'},
                {empId:3,name:'丽丽',sex:'女',age:'38'},
                {empId:4,name:'晓晓',sex:'女',age:'16'},
                {empId:5,name:'张三丰',sex:'男',age:'48'}
            ]
        }
    }
})
</script>

案例完整代码如下

<template>
    <div>
        <h2 align="center">for语句的使用方法讲解</h2>
        <hr>
        <h4 align="left">
        <pre>
            v-for指令基于一个数组渲染一个列表,它和JavaScript的遍历语法相似:
            v-for=”item in list”
            list是一个数组,item是当前被遍历的对象

            在数组进行遍历时,我们必须给遍历对象绑定一个对应的key值以保证对象的唯一性
            使用v-bind:key指令进行绑定

        </pre>
        </h4>
        <ul>
            <li v-for="item in weeks" :key='item'>{{item}}</li>
        </ul>
        <h3 align="center">九九乘法表</h3>
        <hr>
        <table align="center" border="1">
            <tr v-for="i in 9" :key="i">
                <td v-for="j in i" :key="j">{{j}}*{{i}}={{i*j}}</td>
            </tr>
        </table>
        <h3 align="center">员工资料列表</h3>
        <table align="center" width="800px" border="1">
            <thead>
                <tr>
                    <th>员工ID</th>
                    <th>姓名</th>
                    <th>性别</th>
                    <th>年龄</th>
                </tr>
            </thead>
            <tr v-for="row in empList" :key="row.empId">
                <td>{{row.empId}}</td>
                <td>{{row.name}}</td>
                <td>{{row.sex}}</td>
                <td>{{row.age}}</td>
            </tr>

        </table>

    </div>
</template>
<script>

export default({
    name: 'For',
    data(){
        return {
            weeks:[
                "星期一",
                "星期二",
                "星期三",
                "星期四",
                "星期五",
                "星期六",
                "星期日"
            ],
            empList:[
                {empId:1,name:'张三',sex:'男',age:'18'},
                {empId:2,name:'李四',sex:'男',age:'28'},
                {empId:3,name:'丽丽',sex:'女',age:'38'},
                {empId:4,name:'晓晓',sex:'女',age:'16'},
                {empId:5,name:'张三丰',sex:'男',age:'48'}
            ]
        }
    }
})
</script>

本人从事软件项目开发20多年,2005年开始从事Java工程师系列课程的教学工作,录制50多门精品视频课程,包含java基础,jspweb开发,SSH,SSM,SpringBoot,SpringCloud,人工智能,在线支付等众多商业项目,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂

讲师课堂链接:https://edu.youkuaiyun.com/lecturer/893

# U626034 tree ## 题目背景 小 X 要去给机房里的人们题。 ## 题目描述 有 $n$ 个同学需要听小 X 题,机房里共有 $m$ 条路径,但由于机房里的同学们坐姿十分端正,导致某些道路被某些同学的椅子堵住了,使得小 X 无法通过这条道路,小 X 可以通过交流让同学们挪开椅子,从而去给某位同学题,但这会破坏小 X 与这位同学的关系,使小 X 的友好程度下降 $w$ 点。小 X 不想破坏太多与同学之间的关系,所以他想挪开尽可能少的椅子,可是他无法算出结果,所以他想请你帮他算出挪开的最少的椅子数量和下降的最少的友好程度,从而使所有同学之间的路径都连通。 ## 输入格式 输入共 $m+1$ 行: 第一行,两个正整数 $n,m$。 第 $2$ 行到第 $m+1$ 行,每行三个整数 $u,v,w$,代表 $u$ 和 $v$ 之间的路径被堵住了,需要花费 $w$ 点挪开椅子。 ## 输出格式 一行,两个正整数,分别代表小 X 要挪开的最少的椅子数和要花费的最少的友好程度,如果小 X 无论怎么挪都无法让所有同学之间的路径都连通,就输出 `-1 -1`。 ## 输入输出样例 #1 ### 输入 #1 ``` 10 20 1 2 1 1 3 3 1 4 5 3 5 1 2 6 2 2 7 5 4 8 5 4 9 4 6 10 4 5 9 5 2 8 3 1 7 3 2 4 5 5 7 5 8 10 4 5 10 3 1 9 2 2 3 4 3 8 2 4 5 3 ``` ### 输出 #1 ``` 9 20 ``` ## 说明/提示 **本题采用捆绑测试。** 对于 $100\%$ 的数据,$2\le n\le 10^4$,$1\le m\le 2 \times 10^4$,$1\le w \le 10^5$。 |测试点编号 |$n$ |$m$ |$w$ |特殊性质 | |:-------:|:------:|:--------:|:------:|:---:| |$1$ |$\le 10$ |$\le 20$ |$\le 5$ |无 | |$2 \sim 3$ |$\le 100$ |$\le 100$ |$\le 100$ |$u=1$ | |$4\sim 5$ |$\le 10^3$|$\le 2 \times 10^4$|$\le 10^5$|$v=u+1$| |$6 \sim 10$|$\le 10^3$|$\le 2 \times 10^4$|$\le 10^5$|无 |
最新发布
10-30
这个问题本质上是一个**图论中的最小生成树(Minimum Spanning Tree, MST)的变种问题**,但有两个目标: 1. **最小化挪开椅子的数量(即使用的边数)** 2. **在满足连通的前提下,最小化总的友好度损失(即边权之和)** 然而题目要求输出两个值: - 挪开的最少椅子数量(也就是连接所有点所需的最少边数) - 在这个最少边数下,所能达到的最小总权重(友好度下降最少) --- ### ✅ 问题分析 我们有 $ n $ 个同学(顶点),$ m $ 条被堵住的路径(带权边)。每条边可以选择“打通”(花费 $ w $ 的友好度),也可以不打通。 目标是:让所有同学之间**连通**,即形成一个连通图。为了连通 $ n $ 个节点,至少需要 $ n - 1 $ 条边。 所以,“最少挪开椅子数量”一定是 $ n - 1 $ —— 因为少于 $ n - 1 $ 条边不可能让 $ n $ 个点连通。 但如果图中无法选出 $ n - 1 $ 条边来构成一棵生成树(即整个图不连通),则输出 `-1 -1`。 因此: > 第一个问题的答案(最少椅子数)就是 $ n - 1 $,前提是存在生成树。 > > 第二个问题是在所有可能的生成树中,找一棵总权值最小的——这就是标准的 **最小生成树(MST)** 问题! --- ### ✅ 解法总结 1. 使用 Kruskal 或 Prim 算法求出图的最小生成树。 2. 如果不能形成包含 $ n $ 个节点的生成树(即连通分量 > 1),输出 `-1 -1`。 3. 否则: - 最少椅子数 = $ n - 1 $ - 最少友好度损失 = MST 的总权重 --- ### ✅ 代码实现(使用 Kruskal + 并查集) ```python class UnionFind: def __init__(self, n): self.parent = list(range(n)) self.rank = [0] * n self.components = n # 连通分量个数 def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): rx, ry = self.find(x), self.find(y) if rx == ry: return False if self.rank[rx] < self.rank[ry]: rx, ry = ry, rx self.parent[ry] = rx if self.rank[rx] == self.rank[ry]: self.rank[rx] += 1 self.components -= 1 return True def solve(): import sys input = sys.stdin.read data = input().split() n = int(data[0]) m = int(data[1]) edges = [] index = 2 for _ in range(m): u = int(data[index]) - 1 # 转为 0-indexed v = int(data[index + 1]) - 1 w = int(data[index + 2]) edges.append((w, u, v)) index += 3 # 按照权重从小到大排序 edges.sort() uf = UnionFind(n) total_weight = 0 edge_count = 0 for w, u, v in edges: if uf.union(u, v): total_weight += w edge_count += 1 if edge_count == n - 1: break # 检查是否连通 if uf.components != 1: print("-1 -1") else: print(f"{n - 1} {total_weight}") # 示例调用(可以直接运行) if __name__ == "__main__": solve() ``` --- ### 🔍 代码解释 - `UnionFind` 类用于维护连通性,支持高效的合并与查询操作。 - 所有边按权值升序排列,Kruskal 贪心选择不会成环的最小边。 - 每次成功 `union` 表示加入了一条有效边。 - 当选了 $ n - 1 $ 条边时,生成树完成。 - 最后检查是否只剩一个连通分量(即全图连通)。 --- ### ❗ 注意事项 - 输入的节点编号是从 1 开始的,必须转换为 0-based。 - 边数可能不足以形成生成树(比如 $ m < n - 1 $),此时直接判断无法连通。 - 即使 $ m \geq n - 1 $,也可能因为结构问题导致不连通。 --- ### ✅ 示例验证(样例输入) 输入: ``` 10 20 1 2 1 1 3 3 ... ``` 输出: ``` 9 20 ``` 说明:用了 9 条边(正确),总权重为 20,符合 MST 结果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优快云专家-赖老师(软件之家)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值