太原网站制作哪儿好薇,wordpress固定链接设置后进入不,网络推广策略,学校网站建设合同文章目录 版权声明组件的三大组成部分scoped解决样式冲突scoped原理2.代码演示 组件data函数说明演示 组件通信组件关系分类通信解决方案父子通信流程子向父通信代 props详解props校验propsdata、单向数据流 小黑记事本#xff08;组件版#xff09;基础组件结构需求和实… 文章目录 版权声明组件的三大组成部分scoped解决样式冲突scoped原理2.代码演示 组件data函数说明演示 组件通信组件关系分类通信解决方案父子通信流程子向父通信代 props详解props校验propsdata、单向数据流 小黑记事本组件版基础组件结构需求和实现思路完整代码App.vueTodoHeader.vueTodoBody.vueTodoFoot.vue 版权声明
本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用并非商业用途。我在整理学习笔记的过程中尽力确保准确性但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。若您是黑马程序员或相关权利人如有任何侵犯版权的地方请您及时联系我我将立即予以删除或进行必要的修改。对于其他读者请在阅读本博客内容时保持遵守相关法律法规和道德准则谨慎参考并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人不代表黑马程序员的立场。
组件的三大组成部分
结构、样式、逻辑
scoped解决样式冲突
默认情况写在组件中的样式会 全局生效很容易造成多个组件之间的样式冲突问题。
全局样式: 默认组件中的样式会作用到全局任何一个组件中都会受到此样式的影响局部样式: 可以给组件加上scoped 属性,可以让样式只作用于当前组件
scoped原理
当前组件内标签都被添加data-v-hash值 的属性css选择器都被添加 [data-v-hash值] 的属性选择器
最终效果: 必须是当前组件的元素, 才会有这个自定义属性, 才会被这个样式作用到
2.代码演示
BaseOne.vue
templatediv classbase-oneBaseOne/div
/templatescript
export default {}
/scriptstyle scoped
/* 1.style中的样式 默认是作用到全局的2.加上scoped可以让样式变成局部样式组件都应该有独立的样式推荐加scoped原理-----------------------------------------------------scoped原理1.给当前组件模板的所有元素都会添加上一个自定义属性data-v-hash值data-v-5f6a9d56 用于区分开不通的组件2.css选择器后面被自动处理添加上了属性选择器div[data-v-5f6a9d56]
*/
div{border: 3px solid blue;margin: 30px;
}
/styleBaseTwo.vue
templatediv classbase-oneBaseTwo/div
/templatescript
export default {}
/scriptstyle scopeddiv{border: 3px solid red;margin: 30px;}
/styleApp.vue
templatediv idappBaseOne/BaseOneBaseTwo/BaseTwo/div
/templatescript
import BaseOne from ./components/BaseOne
import BaseTwo from ./components/BaseTwo
export default {name: App,components: {BaseOne,BaseTwo}
}
/script组件data函数
说明
在之前的基础阶段的练习中data使用的是对象的写法这是因为方便基础练习全局只有唯一一个data对象data对象写法
Vue.component(my-component, {data: {message: Hello, Vue!},template: div{{ message }}/div
})data函数写法
Vue.component(my-component, {data: function () {return {count: 0}},template: div{{ count }}/div
})在Vue.js中一个组件的data选项必须是一个函数而不是一个对象。为了确保每个组件实例都能维护独立的数据对象避免数据共享和潜在的问题。每次创建一个新的组件实例时Vue会调用这个函数来返回一个新的数据对象以保证实例之间的数据隔离。
Vue.component(my-component, {data() {return {message: Hello, Vue!}},template: lt;divgt;{{ message }}lt;/divgt;
})演示
BaseCount.vuetemplatediv classbase-countbutton clickcount---/buttonspan{{ count }}/spanbutton clickcount/button/div
/templatescript
export default {data: function () {return {count: 100,}},
}
/scriptstyle
.base-count {margin: 20px;
}
/styleApp.vue
templatediv classappbaseCount/baseCountbaseCount/baseCountbaseCount/baseCount/div
/templatescript
import baseCount from ./components/BaseCount
export default {components: {baseCount,},
}
/script
style
/style组件通信
组件通信就是指组件与组件之间的数据传递组件的数据是独立的无法直接访问其他组件的数据。想使用其他组件的数据就需要组件通信
组件关系分类 通信解决方案 父子通信流程
父组件通过 props 将数据传递给子组件子组件利用 $emit 通知父组件修改更新 原因再vue设定中数据是有属主的只有创建数据其的属主组件可以修改该数据 父向子传值步骤
给子组件以添加属性的方式传值子组件内部通过props接收模板中直接使用 props接收的值
父组件代码
templatediv classapp styleborder: 3px solid #000; margin: 10px我是APP组件!-- 1.给组件标签添加属性方式 赋值 --Son :titlemyTitle/Son/div
/templatescript
import Son from ./components/Son.vue
export default {name: App,data() {return {myTitle: 学前端,}},components: {Son,},
}
/scriptstyle
/style子组件代码
templatediv classson styleborder:3px solid #000;margin:10px!-- 3.直接使用props的值 --我是Son组件 {{title}}/div
/templatescript
export default {name: Son-Child,// 2.通过props来接受props:[title]
}
/scriptstyle/style子向父通信代 子组件利用 $emit 通知父组件进行修改更新 子向父传值步骤
$emit触发事件给父组件发送消息通知父组件监听$emit触发的事件提供处理函数在函数的形参中获取传过来的参数 子组件代码
templatediv classson styleborder: 3px solid #000; margin: 10px我是Son组件 {{ title }}button clickchangeFn修改title/button/div
/templatescript
export default {name: Son-Child,props: [title],methods: {changeFn() {// 通过this.$emit() 向父组件发送通知this.$emit(changTitle,son)},},
}
/scriptstyle
/style父组件代码
templatediv classapp styleborder: 3px solid #000; margin: 10px我是APP组件!-- 2.父组件对子组件的消息进行监听 --Son :titlemyTitle changTitlehandleChange/Son/div
/templatescript
import Son from ./components/Son.vue
export default {name: App,data() {return {myTitle: father,}},components: {Son,},methods: {// 3.提供处理函数提供逻辑handleChange(newTitle) {this.myTitle newTitle},},
}
/scriptstyle
/styleprops详解
在Vue.js中props属性是一种用于从父组件向子组件传递数据的机制。props 定义组件上 注册的一些 自定义属性props 作用向子组件传递数据特点 可以 传递 任意数量 的prop可以 传递 任意类型 的prop props校验
作用为组件的 prop 指定验证要求不符合要求控制台就会有错误提示 → 帮助开发者快速发现错误语法 ① 类型校验 ② 非空校验 ③ 默认值 ④ 自定义校验基础写法 完整写法 default和required一般不同时写因为当时必填项时肯定是有值的default后面如果是简单类型的值可以直接写默认。如果是复杂类型的值则需要以函数的形式return一个默认值
props: {w: {type: Number,required: true,default: 0,validator(val) {// console.log(val)if (val 100 || val 0) {console.error(传入的范围必须是0-100之间)return false} else {return true}},},}propsdata、单向数据流 共同点都可以给组件提供数据 区别 data 的数据是自己的 → 随便改prop 的数据是外部的 → 不能直接改要遵循 单向数据流 单向数据流父级props 的数据更新会向下流动影响子组件。这个数据流动是单向的 父组件代码
templatediv classappBaseCount :countcount changeCounthandleChange/BaseCount/div
/templatescript
import BaseCount from ./components/BaseCount.vue
export default {components:{BaseCount},data(){return {count:100}},methods:{handleChange(newVal){this.count newVal}}
}
/scriptstyle/style子组件代码
templatediv classbase-countbutton clickhandleSub-/buttonspan{{ count }}/spanbutton clickhandleAdd/button/div
/templatescript
export default {props: {count: {type: Number,},},methods: {handleSub() {this.$emit(changeCount, this.count - 1)},handleAdd() {this.$emit(changeCount, this.count 1)},},
}
/scriptstyle
.base-count {margin: 20px;
}
/style小黑记事本组件版
基础组件结构 需求和实现思路
需求说明 ① 拆分基础组件 ② 渲染待办任务 ③ 添加任务 ④ 删除任务 ⑤ 底部合计 和 清空功能 ⑥ 持久化存储 列表渲染思路分析
提供数据提供在公共的父组件 App.vue通过父传子将数据传递给TodoMain利用v-for进行渲染 添加功能思路分析
收集表单数据 v-model监听时间 回车点击 都要进行添加子传父将任务名称传递给父组件App.vue父组件接受到数据后 进行添加 unshift(自己的数据自己负责) 删除功能思路分析
监听时间监听删除的点击携带id子传父将删除的id传递给父组件App.vue进行删除 filter (自己的数据自己负责) 底部功能及持久化存储思路分析
底部合计父组件传递list到底部组件 —展示合计清空功能监听事件 — 子组件通知父组件 —父组件清空持久化存储watch监听数据变化持久化到本地
完整代码
App.vue
template!-- 主体区域 --section idappTodoHeader addhandleAdd/TodoHeaderTodoBody :listlist delhandleDel/TodoBodyTodoFoot :lenlist.length clearhandleClear/TodoFoot/section
/templatescript
import TodoHeader from /components/TodoHeader;
import TodoBody from /components/TodoBody;
import TodoFoot from /components/TodoFoot;// 渲染功能
// 1.提供数据 提供在公共的父组件 App.vue
// 2.通过父传子将数据传递给TodoMain
// 3.利用 v-for渲染// 添加功能
// 1.手机表单数据 v-model
// 2.监听事件回车点击都要添加
// 3.子传父讲任务名称传递给父组件 App.vue
// 4.进行添加 unshift自己的数据自己负责
// 5.清空文本框输入的内容
// 6.对输入的空数据 进行判断// 删除功能
// 1.监听事件监听删除的点击 携带id
// 2.子传父讲删除的id传递给父组件的App.vue
// 3.进行删除filter自己的数据 自己负责// 底部合计父传子 传list.length 渲染
// 清空功能子传父 通知父组件 → 父组件进行更新
// 持久化存储watch深度监视list的变化 - 往本地存储 -进入页面优先读取本地数据export default {components:{TodoHeader,TodoBody,TodoFoot},data () {return {//优先从本地存储读取list: JSON.parse(localStorage.getItem(list)) || [{id:1, name: 干饭},{id:2, name: 干饭},{id:3, name: 干饭}]}},methods:{handleAdd(newVal) {//console.log(newVal)this.list.unshift({id: new Date(),name: newVal})},handleDel(id) {this.listthis.list.filter(item item.id!id)},handleClear() {this.list[]}},watch:{list:{deep: true,handle(newValue) {localStorage.setItem(list,JSON.stringify(newValue))}}}
}
/scriptstyle/style
TodoHeader.vue
template!-- 输入框 --header classheaderh1小黑记事本/h1input placeholder请输入任务 classnew-todo v-modeltodoname keyup.enterhandleAdd/button classadd clickhandleAdd添加任务/button/header/templatescript
export default {name: TodoHeader,data() {return{todoname: }},methods:{handleAdd() {if(this.todoname.trim()){alert(任务名称为空)return}this.$emit(add,this.todoname)this.todoname}}
}/scriptstyle scoped/style
TodoBody.vue
template!-- 列表区域 --section classmainul v-for(item,index) in list :keyitem.id classtodo-listli classtododiv classviewspan classindex{{index1}}./span label{{item.name}}/labelbutton classdestroy clickhandeleDel(item.id)/button/div/li/ul/section
/templatescript
export default {name: TodoBody,props: {list: {type: Array}},methods:{handeleDel(id) {this.$emit(del,id)}}
}
/scriptstyle scoped/style
TodoFoot.vue
template!-- 统计和清空 --footer classfooter!-- 统计 --span classtodo-count合 计:strong {{len}} /strong/span!-- 清空 --button classclear-completed clickclear清空任务/button/footer/templatescript
export default {name: TodoFoot,props:{len: Number},methods:{clear() {this.$emit(clear)}}
}
/scriptstyle scoped/style 文章转载自: http://www.morning.sqgsx.cn.gov.cn.sqgsx.cn http://www.morning.ddfp.cn.gov.cn.ddfp.cn http://www.morning.ggtgl.cn.gov.cn.ggtgl.cn http://www.morning.lrplh.cn.gov.cn.lrplh.cn http://www.morning.qxnns.cn.gov.cn.qxnns.cn http://www.morning.spsqr.cn.gov.cn.spsqr.cn http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn http://www.morning.wmmtl.cn.gov.cn.wmmtl.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.pnntx.cn.gov.cn.pnntx.cn http://www.morning.qpmwb.cn.gov.cn.qpmwb.cn http://www.morning.ttdbr.cn.gov.cn.ttdbr.cn http://www.morning.yxwnn.cn.gov.cn.yxwnn.cn http://www.morning.fbtgp.cn.gov.cn.fbtgp.cn http://www.morning.xqndf.cn.gov.cn.xqndf.cn http://www.morning.bxqtq.cn.gov.cn.bxqtq.cn http://www.morning.xdpjf.cn.gov.cn.xdpjf.cn http://www.morning.qjdqj.cn.gov.cn.qjdqj.cn http://www.morning.kpbgp.cn.gov.cn.kpbgp.cn http://www.morning.bfsqz.cn.gov.cn.bfsqz.cn http://www.morning.khpgd.cn.gov.cn.khpgd.cn http://www.morning.tfrlj.cn.gov.cn.tfrlj.cn http://www.morning.smhtg.cn.gov.cn.smhtg.cn http://www.morning.yhwyh.cn.gov.cn.yhwyh.cn http://www.morning.nnykz.cn.gov.cn.nnykz.cn http://www.morning.ffbp.cn.gov.cn.ffbp.cn http://www.morning.sfcfy.cn.gov.cn.sfcfy.cn http://www.morning.bksbx.cn.gov.cn.bksbx.cn http://www.morning.lrwsk.cn.gov.cn.lrwsk.cn http://www.morning.rftk.cn.gov.cn.rftk.cn http://www.morning.qrlkt.cn.gov.cn.qrlkt.cn http://www.morning.zzqgc.cn.gov.cn.zzqgc.cn http://www.morning.nqyzg.cn.gov.cn.nqyzg.cn http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn http://www.morning.wqbfd.cn.gov.cn.wqbfd.cn http://www.morning.sgmgz.cn.gov.cn.sgmgz.cn http://www.morning.lznqb.cn.gov.cn.lznqb.cn http://www.morning.monstercide.com.gov.cn.monstercide.com http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.xqbbc.cn.gov.cn.xqbbc.cn http://www.morning.mbqyl.cn.gov.cn.mbqyl.cn http://www.morning.lczxm.cn.gov.cn.lczxm.cn http://www.morning.qjmnl.cn.gov.cn.qjmnl.cn http://www.morning.dmwbs.cn.gov.cn.dmwbs.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.lkthj.cn.gov.cn.lkthj.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.jfjfk.cn.gov.cn.jfjfk.cn http://www.morning.dhqyh.cn.gov.cn.dhqyh.cn http://www.morning.wylpy.cn.gov.cn.wylpy.cn http://www.morning.rdkt.cn.gov.cn.rdkt.cn http://www.morning.hkgcx.cn.gov.cn.hkgcx.cn http://www.morning.rkdw.cn.gov.cn.rkdw.cn http://www.morning.mjtgt.cn.gov.cn.mjtgt.cn http://www.morning.wjxtq.cn.gov.cn.wjxtq.cn http://www.morning.hwprz.cn.gov.cn.hwprz.cn http://www.morning.807yy.cn.gov.cn.807yy.cn http://www.morning.npxcc.cn.gov.cn.npxcc.cn http://www.morning.qqnh.cn.gov.cn.qqnh.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.dzrcj.cn.gov.cn.dzrcj.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.rcmcw.cn.gov.cn.rcmcw.cn http://www.morning.nkjxn.cn.gov.cn.nkjxn.cn http://www.morning.xkhhy.cn.gov.cn.xkhhy.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn http://www.morning.nwjzc.cn.gov.cn.nwjzc.cn http://www.morning.brjq.cn.gov.cn.brjq.cn http://www.morning.cjqcx.cn.gov.cn.cjqcx.cn http://www.morning.qszyd.cn.gov.cn.qszyd.cn http://www.morning.pxwzk.cn.gov.cn.pxwzk.cn http://www.morning.ztqyj.cn.gov.cn.ztqyj.cn http://www.morning.pntzg.cn.gov.cn.pntzg.cn http://www.morning.mxhys.cn.gov.cn.mxhys.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.ylqrc.cn.gov.cn.ylqrc.cn http://www.morning.bswnf.cn.gov.cn.bswnf.cn http://www.morning.pzbqm.cn.gov.cn.pzbqm.cn