Vue | (三)使用Vue脚手架(中)| 尚硅谷Vue2.0+Vue3.0全套教程

文章目录

  • 📚Todo-list 案例
    • 🐇组件化编码流程(通用)
    • 🐇实现静态组件
    • 🐇展示动态数据
    • 🐇交互
      • ⭐️添加一个todo
      • ⭐️todo勾选实现
      • ⭐️删除功能实现
      • ⭐️底部统计功能实现
      • ⭐️底部全选功能实现
      • ⭐️底部一键清除功能实现
  • 📚案例小结
  • 📚浏览器本地存储
  • 📚TodoList本地存储

学习链接:尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通,本文对应p70-p79,博客参考尚硅谷公开笔记,补充记录实操。

📚Todo-list 案例

🐇组件化编码流程(通用)

  1. 实现静态组件:抽取组件,使用组件实现静态页面效果。
  2. 展示动态数据
    • 数据的类型、名称是什么?
    • 数据保存在哪个组件?
  3. 交互——从绑定事件监听开始。

🐇实现静态组件

在这里插入图片描述

  • 组件名:不要和原有标签名冲突(不管大小写,例如Header),开发中也一般不用MyHeader,Vue鼓励采用UserHeade.vue类似命名。

  • 注册好先搭结构,链接好层级关系(关注地址的正确链接)

    <!-- App.vue -->
    <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter}}
    </script>
    
    <!-- UserList.vue -->
    <script>import UserItem from '../components/UserItem'export default {name:'UserList',components:{UserItem}}
    </script>
    
  • 样式套用

    • 先都放到App.vue里,然后再拆,先拆结构,再拆样式
    • 拆结构的时候,App.vue里的结构剪切后,要连带着补上标签,防忘。
    • 拆样式的时候,在特定vue对应样式可补上scoped,放冲突。
      在这里插入图片描述

在这里插入图片描述

🐇展示动态数据

  • 数据的类型、名称是什么? 一堆数据用数组,每个数据里的属性用对象。
    在这里插入图片描述
  • 数据保存在哪个组件? 那个组件要展示就给谁,即谁用给谁——UserList。
  • 重要】链接上数据发送:demo='xxx'和接收props:[demo]

  • UserList.vue关键部分
    <template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj"></UserItem></ul>
    </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}}}
    </script>
    
  • UserItem.vue关键部分
    <template><li><label><input type="checkbox" :checked="fasong.done"/><span>{{fasong.title}}</span></label><button class="btn btn-danger" style="display:none">删除</button></li>
    </template><script>export default {name:'UserItem',// 声明接收发送内容props:['fasong']}
    </script>
    
  • 目前的设置是数据都放List且暂时还都合理。
    在这里插入图片描述

🐇交互

⭐️添加一个todo

  • id自动生成借助nanoid
    在这里插入图片描述
  • 遇到的问题:按暂时的知识量,兄弟vue(header和list)之间的数据传输很难办——解决办法:把数据交给“爹”App.vue。具体通过爹提前给儿传一个函数(props也可以传函数),然后儿把数据借助函数传给爹实现。
    在这里插入图片描述在这里插入图片描述

  • UserList.vue关键部分

    <template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj"></UserItem></ul>
    </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},props:['todos']}
    </script>
    
  • UserHeader.vue关键部分

    <template><div class="todo-header"><input type="text" placeholder="请输入你的任务名称,按回车键确认" @keyup.enter="add"/></div>
    </template><script>import {nanoid} from 'nanoid'export default {name:'UserHeader',props:['addTodo'],methods:{add(e){// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:e.target.value,done:false}this.addTodo(todoObj)}}}
    </script>
    
  • App.vue关键部分

    <template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos"></UserList><UserFooter></UserFooter></div></div></div>
    </template><!-- App.vue -->
    <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{addTodo(todoObj){this.todos.unshift(todoObj)}}}
    </script>
    

在这里插入图片描述


  • 进一步完善:添加完后输入框清空。
    add(e){// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:e.target.value,done:false}this.addTodo(todoObj)e.target.value = ''
    }
    

在这里插入图片描述


在这里插入图片描述

  • 进一步完善:输入框必须有输入才能提交,这里不借助event,而是通过v-model完成数据读取。
    <template><div class="todo-header"><input type="text" placeholder="请输入你的任务名称,按回车键确认" v-model="title" @keyup.enter="add"/></div>
    </template><script>import {nanoid} from 'nanoid'export default {name:'UserHeader',props:['addTodo'],methods:{add(){// 校验数据if(!this.title) return alert('输入不能为空')// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:this.title,done:false}// 通知APP组件去添加一个todo对象this.addTodo(todoObj)// 清空输入this.title = ''}}}
    </script>
    
    • 这时会出现以下警告,而且清空失效。在这里插入图片描述
    • 修改(给title定义)
      <script>import {nanoid} from 'nanoid'export default {name:'UserHeader',props:['addTodo'],data(){return{title:""}},methods:{add(){// 校验数据if(!this.title) return alert('输入不能为空')// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:this.title,done:false}// 通知APP组件去添加一个todo对象this.addTodo(todoObj)// 清空输入this.title = ''}}}
      </script>
      

在这里插入图片描述

在这里插入图片描述

  • 其他注意点:函数命名不能重复(addaddtodo)。

⭐️todo勾选实现

  • 现在可以勾选,但是vue实际的数据是没有变化的。
    在这里插入图片描述
  • 关键点
    • 数据在哪,关于数据的操作就在哪——在App.vue里定义函数。
    • App.vueItem.vue是爷爷对孙子的关系,相关传输要先给他爸List.vue,再由他爸给他(现阶段)。

  • UserItem.vue关键代码
    <template><li><label><input type="checkbox" :checked="fasong.done" @change="handleCheck(fasong.id)"/><span>{{fasong.title}}</span></label><button class="btn btn-danger" style="display:none">删除</button></li>
    </template><script>export default {name:'UserItem',// 声明接收发送内容props:['fasong','checkTodo'],methods:{handleCheck(id){// 通知App组件将对应的todo对象的done值取反this.checkTodo(id)}}}
    </script>
    
  • UserList.vue关键代码
    <template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj" :checkTodo="checkTodo"></UserItem></ul>
    </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},props:['todos','checkTodo']}
    </script>
    
  • App.vue关键代码
    <template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo"></UserList><UserFooter></UserFooter></div></div></div></template><!-- App.vue -->
    <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})}}}
    </script>
    

在这里插入图片描述在这里插入图片描述


  • v-model实现:就是在上一个功能实现的基础上,忽略本功能实现的之前代码,只将:checked="fasong.done"改为v-model="fasong.done" ,但这里已经和视频有出入,即vue版本更新后,这个方法不可行,会报错(本质是props只读):
    在这里插入图片描述

⭐️删除功能实现

  • 在Item里加一个鼠标悬浮效果
    li:hover{background-color: #ddd 
    }
    
    在这里插入图片描述
  • 让删除按钮悬浮出现:结构里的内联stylestyle="display:none"删掉,添加悬浮条件(前边默认设置为none)
    li:hover button{display: block;
    }
    
    在这里插入图片描述
  • 交互实现:点击按钮,拿到id,把对应id的事件删除。
    • 这里依旧注意函数名称设置问题,不要用默认名称,会混乱会报错!
    • 依旧是App.vueItem.vue是爷爷对孙子的关系,相关传输要先给他爸List.vue,再由他爸给他(现阶段)

  • UserItem.vue关键代码

    <template><li><label><input type="checkbox" :checked="fasong.done" @change="handleCheck(fasong.id)"/><span>{{fasong.title}}</span></label><button class="btn btn-danger" @click="handleDelete(fasong.id)">删除</button></li>
    </template><script>export default {name:'UserItem',// 声明接收发送内容props:['fasong','checkTodo','deleteTodo'],methods:{// 勾选or取消勾选handleCheck(id){// 通知App组件将对应的todo对象的done值取反this.checkTodo(id)},// 删除handleDelete(id){if(confirm('确定删除吗?')){// 通知App组件删除this.deleteTodo(id)}}}}
    </script>
    
  • UserList.vue关键代码

    <template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj" :checkTodo="checkTodo":deleteTodo="deleteTodo"></UserItem></ul>
    </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},props:['todos','checkTodo','deleteTodo']}
    </script>
    
  • App.vue关键代码

    <template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></UserList><UserFooter></UserFooter></div></div></div></template><!-- App.vue -->
    <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// 	return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)}}}
    </script>
    

    在这里插入图片描述
    在这里插入图片描述

⭐️底部统计功能实现

  1. todos传给Footer,在App.vue添加<UserFooter :todos="todos"></UserFooter>
  2. UserFooter.vue
    • 读取todos.length作为全部数值显示。
    • 计算属性,算donetrue的数量。
    <template><div class="todo-footer"><label><input type="checkbox"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{todos.length}}</span><button class="btn btn-danger">清除已完成任务</button></div>
    </template><script>export default {name:'UserFooter',props:['todos'],computed:{doneTotal(){// 法一// let i = 0// this.todos.forEach((todo)=>{//     if(todo.done) i++// })// return i// 法二return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)}}}
    </script>
    
    在这里插入图片描述

⭐️底部全选功能实现

  • 考虑实际情境的细节优化。
  • 同样也是对todos的操作写到App.vue
  • App.vue关键代码
    <template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></UserList><UserFooter :todos="todos" :checkAllTodo="checkAllTodo"></UserFooter></div></div></div></template><!-- App.vue -->
    <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// 	return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)},// 全选or取消全选checkAllTodo(done){this.todos.forEach((todo)=>{todo.done = done})}}}
    </script>
    
  • UserFooter.vue关键代码
    <template><div class="todo-footer" v-show="total"><label><input type="checkbox" :checked="isAll" @change="checkAll"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{total}}</span><button class="btn btn-danger">清除已完成任务</button></div>
    </template><script>export default {name:'UserFooter',props:['todos','checkAllTodo'],computed:{total(){return this.todos.length},doneTotal(){// 法一// let i = 0// this.todos.forEach((todo)=>{//     if(todo.done) i++// })// return i// 法二return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)},isAll(){return this.doneTotal === this.total && this.total > 0}},methods:{checkAll(e){this.checkAllTodo(e.target.checked)}}}
    </script>
    

在这里插入图片描述


  • 优化UserFooter.vue:借助v-model及计算属性(之前v-model失效是因为绑到props了)。
    <template><div class="todo-footer" v-show="total"><label><input type="checkbox" v-model="isAll"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{total}}</span><button class="btn btn-danger">清除已完成任务</button></div>
    </template><script>export default {name:'UserFooter',props:['todos','checkAllTodo'],computed:{total(){return this.todos.length},doneTotal(){return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)},isAll:{get(){return this.doneTotal === this.total && this.total > 0},set(value){this.checkAllTodo(value)}}}}
    </script>
    

⭐️底部一键清除功能实现

  • App.vue部分
    <template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></UserList><UserFooter :todos="todos" :checkAllTodo="checkAllTodo" :clearAllTodo="clearAllTodo"></UserFooter></div></div></div></template><!-- App.vue -->
    <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// 	return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)},// 全选or取消全选checkAllTodo(done){this.todos.forEach((todo)=>{todo.done = done})},// 清除所有已经完成的todoclearAllTodo(){this.todos = this.todos.filter((todo)=>{return !todo.done})}}}
    </script>
    
  • UserFooter.vue部分
    <template><div class="todo-footer" v-show="total"><label><input type="checkbox" v-model="isAll"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{total}}</span><button class="btn btn-danger" @click="clearAll">清除已完成任务</button></div>
    </template><script>export default {name:'UserFooter',props:['todos','checkAllTodo','clearAllTodo'],computed:{total(){return this.todos.length},doneTotal(){return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)},isAll:{get(){return this.doneTotal === this.total && this.total > 0},set(value){this.checkAllTodo(value)}}},methods:{clearAll(){this.clearAllTodo()}}}
    </script>
    
    在这里插入图片描述
    在这里插入图片描述

📚案例小结

  1. 组件化编码流程

    • 拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突。
    • 实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:
      • 一个组件在用:放在组件自身即可。
      • 一些组件在用:放在他们共同的父组件上(状态提升)。
    • 实现交互:从绑定事件开始。
  2. props适用于

    • 父组件 ==> 子组件 通信
    • 子组件 ==> 父组件 通信(要求父先给子一个函数)
  3. 使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!

📚浏览器本地存储

  1. 浏览器的搜索历史就是借助了本地存储。

  2. 存储内容大小一般支持5MB左右(不同浏览器可能还不一样)

  3. 浏览器端通过 Window.sessionStorageWindow.localStorage属性来实现本地存储机制。

  4. 相关API:

    • xxxxxStorage.setItem('key', 'value');:该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。
    • xxxxxStorage.getItem('person');:该方法接受一个键名作为参数,返回键名对应的值。
    • xxxxxStorage.removeItem('key');:该方法接受一个键名作为参数,并把该键名从存储中删除。
    • xxxxxStorage.clear():该方法会清空存储中的所有数据。
  5. 备注:

    • SessionStorage存储的内容会随着浏览器窗口关闭而消失。
    • LocalStorage存储的内容,需要手动清除才会消失。
    • xxxxxStorage.getItem(xxx)如果xxx对应的value获取不到,那么getItem的返回值是null。
    • JSON.parse(null)的结果依然是null。

  • localStorage.html
    <!DOCTYPE html>
    <html><head><meta charset="UTF-8" /><title>localStorage</title></head><body><h2>localStorage</h2><button onclick="saveData()">点我保存一个数据</button><button onclick="readData()">点我读取一个数据</button><button onclick="deleteData()">点我删除一个数据</button><button onclick="deleteAllData()">点我清空一个数据</button><script type="text/javascript" >let p = {name:'张三',age:18}function saveData(){localStorage.setItem('msg','hello!!!')localStorage.setItem('msg2',666)localStorage.setItem('person',JSON.stringify(p))}function readData(){console.log(localStorage.getItem('msg'))console.log(localStorage.getItem('msg2'))const result = localStorage.getItem('person')console.log(JSON.parse(result))}function deleteData(){localStorage.removeItem('msg2')}function deleteAllData(){localStorage.clear()}</script></body>
    </html>
    
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
  • **localStorage.html**即对应部分API换成sessionStorage

📚TodoList本地存储

  • 目的:自添加事项刷新后不清除。
  • App.vue添加watch,同时data里配套读取
    export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:JSON.parse(localStorage.getItem('todos')) || []}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// 	return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)},// 全选or取消全选checkAllTodo(done){this.todos.forEach((todo)=>{todo.done = done})},// 清除所有已经完成的todoclearAllTodo(){this.todos = this.todos.filter((todo)=>{return !todo.done})}},watch:{todos:{// 开启深度监视deep:true,handler(value){localStorage.setItem('todos',JSON.stringify(value))}}}
    }
    
  • 刷新后不清除
    在这里插入图片描述

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

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

相关文章

Docker从入门到上天系列第二篇:Docker与传统虚拟机对比

&#x1f609;&#x1f609; 欢迎加入我们的学习交流群呀&#xff01; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、Security、Docker、Grpc、消息中间件、Rpc、SpringCloud等等很多应用和源码级…

代码随想录算法训练营day17||二叉树part04、110.平衡二叉树 、257. 二叉树的所有路径 、404.左叶子之和

注意&#xff1a;迭代法&#xff0c;可以先过&#xff0c;二刷有精力的时候 再去掌握迭代法。 110.平衡二叉树 &#xff08;优先掌握递归&#xff09; 再一次涉及到&#xff0c;什么是高度&#xff0c;什么是深度&#xff0c;可以巩固一下。 题目&#xff1a;给定一个二叉树&am…

为什么从没有负值的数据中绘制的小提琴图(Violin Plot)会出现负值部分?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 小提琴图&#xff08;Violin Plot&#xff09; 是一种用于展示和比较数据分布的可视化工具。它结合了箱形图&#xff08;Box Plot&#xff09;和密度图&#xff08;Kernel Density Plot&#xff09;的特…

Java实现自动化pdf打水印小项目 使用技术pdfbox、Documents4j

文章目录 前言源码获取一、需求说明二、 调研pdf处理工具word处理工具 三、技术栈选择四、功能实现实现效果详细功能介绍详细代码实现项目目录WordUtilsMain类实现部分&#xff1a;第一部分Main类实现部分&#xff1a;第二部分Main类实现部分&#xff1a;第三部分 资料获取 前言…

数字化转型导师坚鹏:政府数据治理方法及成功案例

课程背景&#xff1a; 很多政府存在以下问题&#xff1a; 不知道如何理解数据治理标准化建设模式&#xff1f; 不清楚如何有效掌握政府数据治理落地技术&#xff1f; 不清楚如何有效学习标杆政府数据治理案例&#xff1f; 学员收获: 深入理解数据治理标准化建设模式。…

Python学习-环境搭建

一、序章 1、Python的后台是PyPI。 2、PyPI是一个拥有成千上万第三方模块的地方。 二、环境搭建 1、Python官网地址 https://www.python.org&#xff0c;在download中下载对应系统最新版本即可。 2、安装安装包 勾选“Add Python 3.10 to PATH”&#xff0c;然后点击“I…

05 扩展组件:自定义CheckBox组件

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 目…

离线升级esp32开发板升级包esp32-2.0.14(最新版已经3.0alpha了)

1.Arduino IDE 2.3.2最新 2024.2.20升级安装:https://www.arduino.cc/en/software 2.开发板地址 地址&#xff08;esp8266,esp32&#xff09; http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32…

鸿蒙小案例-五子棋

鸿蒙小案例-五子棋 1.准备组件(组件布局) 2.下棋功能实现 3.机器人下棋功能实现 4.赢棋功能实现 5.附属功能实现刚开始以为挺简单的&#xff0c;越写越…emo 因为代码有点多&#xff0c;所以这里就简单讲下逻辑&#xff0c;文末贴上代码 逻辑只是我个人想的&#xff0c;不代…

线阵相机参数介绍之轴编码器控制

1.1 功能介绍 编码器是将检测对象的运动与相机拍摄取图相匹配的设备&#xff0c;也即检测对象运动一定距离&#xff0c;相机就拍摄一定行高的图像。 编码器会将检测对象的实际位移转换为固定数量电信号。例如&#xff1a;编码器的精度是2000p/r,该参数的含义是编码器每转一圈输…

IDEA插件推荐:免费好用!

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

C语言------------指针笔试题目深度剖析

1. #include <stdio.h> int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } 首先要明白这个强制类型转换&#xff0c;即int(*)[5]类型转换成int(*)类型&#xff1b; *&#xff…

MySQL 安装步骤

下载地址&#xff1a;https://downloads.mysql.com/archives/community/&#xff0c; 选择第二个 将下载的压缩包解压到自己想要放到的目录下&#xff08;路径中最好不要有中文&#xff09; 一、添加环境变量 环境变量里面有很多选项&#xff0c;这里我们只用到Path这个参数…

爬虫知识--02

免费代理池搭建 # 代理有免费和收费代理 # 代理有http代理和https代理 # 匿名度&#xff1a; 高匿&#xff1a;隐藏访问者ip 透明&#xff1a;服务端能拿到访问者ip 作为后端&#xff0c;如何拿到使用代理人的ip 请求头中&#xff1a;x-forwor…

day3 2/20

1> 使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 #include<myhead.h> int main(int argc, const char *argv[]) {int fd1-1,fd2-1;if((fd1open("./ggb.bmp",O_RDONLY,0664))…

Go语言中的流程控制

「万事开头难&#xff0c;视频号500粉直播需要你的助力&#xff01;你的支持是我前进的动力&#xff01;」 1、Golang 中的流程控制 流程控制是每种编程语言控制逻辑走向和执行次序的重要部分&#xff0c;流程控制可以说是一门语言的“经脉”。Go 语言中最常用的流程控制有 if …

【案例研习笔记】KodeRover_云时代 DevOps 建设

轻度量、轻流程、重开发者体验生产力工具建设要大于管理工具建设贴合自己业务&#xff0c;不要去求大求全

回避型人格适合什么职业?如何改善回避型人格?

回避型人格最突出的特点,就是对外界的排斥极度敏感&#xff0c;他们非常害怕别人的不认可&#xff0c;也特别害惧失败&#xff0c;因此不敢与人交往&#xff0c;同时也害怕新事物。因为受到这一性格的影响&#xff0c;他们极度缺乏社交能力&#xff0c;也一直在否定自身能力。 …

网络协议汇总

1.HTTP协议 1.认识URL 平时我们俗称的 "网址" 其实就是说的 URL URL中的字符只能是ASCII字符&#xff0c;但是ASCII字符比较少&#xff0c;而URL则常常包含ASCII字符集以外的字符&#xff0c;如非英语字符、汉字、特殊符号等等&#xff0c;所以要对URL进行转换。这个…

已解决Application run failed org.springframework.beans.factory.BeanNot

问题原因&#xff1a;SpringBoot的版本与mybiats-puls版本不对应且&#xff0c;spring自带的mybiats与mybiats-puls版本不对应 这里我用的是3.2.2版本的SpringBoot&#xff0c;之前mybiats-puls版本是3.5.3.1有所不同。 问题&#xff1a;版本对不上 解决办法&#xff1a;完整…