vue3 浅尝 分页
基于vue3的一个简单分页 父子组件通信传值
父组件
1 <template>
2 <div class="top">
3
4 </div>
5 <pagination :total="total" :pageNo="pageNo" :pageSize="pageSize" @event="eventData"></pagination><!-- 使用组件 -->
6 </template>
7
8 <script >
9 import { defineComponent,ref } from "vue"
10 import Pagination from "@/components/Pagination.vue" //引入组件
11 export default {
12 components:{ //注册组件
13 Pagination
14 },
15 setup() {
16 const pageNo = ref(1) //当前页
17 const pageSize = ref(10) //每页的数量
18 const total = ref(100) //总数量
19
20 const eventData = (data)=>{ //子组件传值触发
21 console.log(data,"子组件传来的值")
22 }
23
24 return {
25 pageNo,
26 pageSize,
27 total,
28 eventData
29 }
30 }
31 }
32 </script>
33
34 <style lang="scss" scoped>
35 .top{
36 height: 600px;
37 }
38
39
40 </style>
子组件
1 <template>
2 <div class="out">
3 <div class="item prev but" @click="prev">上一页</div>
4
5 <!-- 循环计算出来页数 -->
6 <template v-for="(item,index) in pageArr" :key="index">
7 <div
8 class="item"
9 :class="['item',item == newPage?'num':'']"
10 @click="selectNum(item)"
11 >
12 {{item}}
13 </div>
14 </template>
15
16 <div class="item next but" @click="next">下一页</div>
17
18 <div class="item page">共{{page}}页</div>
19
20 到
21 <input class="item skipInput" type="number" v-model="skipNum" >
22 页
23
24 <div class="item skip" @click="skip">确定</div>
25 </div>
26 </template>
27
28 <script>
29 import { defineComponent,ref,onMounted } from "vue"
30 export default {
31 name:'Pagination',
32 props:{ //定义默认的类型及值
33 pageNo:{
34 type:Number,
35 default:1
36 },
37 pageSize:{
38 type:Number,
39 default:10,
40 },
41 total:{
42 type:Number,
43 default:0,
44 }
45 },
46 setup(props,{emit}){
47 // console.log(props.total,props.pageSize,props.pageNo,"============") //vue3的查看父组件传来的值
48
49 const page = ref() //计算出来页数
50 const pageArr = ref([]) //排列出来的页数
51 const skipNum = ref() //填入的跳转页数
52 const newPage = ref() //当前的页数
53
54 newPage.value = props.pageNo //将默认值赋给子组件内的默认值
55 page.value = parseInt((props.total + props.pageSize - 1) / props.pageSize) //计算展示出来页码有多少
56 for(let i = 0;i<page.value;i++){ //将计算出来的页码循环到排列使用的数组里面
57 pageArr.value.push(i+1)
58 }
59
60 const prev = ()=>{ //上一页
61 if(newPage.value ==1){
62 console.log("已经是第一页了") //替换为ui库里面的全局弹框组件里面(以下同理)
63 return
64 }else{
65 newPage.value -= 1
66 }
67 trigger(newPage.value) //将计算好的值传入到触发父组件方法里面
68 }
69 const next = ()=>{ //下一页
70 if(newPage.value ==page.value){
71 console.log("已经是最后一页了")
72 return
73 }else{
74 newPage.value += 1
75 }
76 trigger(newPage.value)
77 }
78 const selectNum = (data)=>{ //选择数字
79 trigger(data)
80 }
81 const trigger = (value)=>{ //去触发父组件方法函数
82 newPage.value = value
83 let params = {
84 newPage:parseInt(value)
85 }
86 emit('event',params)
87 }
88 const skip = ()=>{ //点击确定
89 if(typeof(skipNum.value) != 'number'){
90 console.log("不是一个数字")
91 return
92 }else if(skipNum.value > page.value){
93 console.log("不能大于总页数")
94 return
95 }else if(skipNum.value < 1){
96 console.log("不能小于1")
97 return
98 }
99 trigger(skipNum.value)
100 }
101 return {
102 page,
103 pageArr,
104 skipNum,
105 newPage,
106 selectNum,
107 prev,
108 next,
109 trigger,
110 skip
111 }
112 }
113 }
114 </script>
115
116 <style lang="scss" scoped>
117 .out{
118 width: 100%;
119 height: 50px;
120 display: flex;
121 justify-content: flex-end;
122 align-items: center;
123 }
124 .item{
125 margin: 0 10px;
126 width: 34px;
127 height: 34px;
128 background: linear-gradient(0deg, #DADADA, #F5F5F5);
129 box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.4);
130 border-radius: 6px;
131 display: flex;
132 justify-content: center;
133 align-items: center;
134 font-size: 18px;
135 font-family: Arial;
136 font-weight: 400;
137 color: #2E2E2E;
138 }
139 .item.num{
140 background: #B9905F;
141 color: #fff;
142 }
143 .item.but{
144 width: 80px;
145 }
146 .item.page{
147 width: 80px;
148 background: #fff;
149 box-shadow:none;
150 border: none;
151 }
152 .item.skipInput{
153 margin: 0 3px;
154 width: 50px;
155 height: 34px;
156 padding: 0 3px;
157 margin: 0 0;
158 background: #E6E6E6;
159 border: #E6E6E6;
160 /* box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.35); */
161 border-radius: 6px;
162 outline-color: #E6E6E6;
163 }
164 .item.skip{
165 width: 50px;
166 background: #B9905F;
167 color: #fff;
168
169 }
170 </style>
忍一时,越想越气;
退一步,哎呦我去!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通