「时光不负,创作不停,本文正在参加2021年终总结征文大赛」
有这么一个功能 需要点击切换 然后展示不一样的功能组件,如果是你 你会怎么做?
可以先看一下我接手的代码 请忍住不要笑!!!
好家伙,给我整蒙了,还能这样玩????不多废话,直接给我的解决方法,如果有更好的请联系我!!!
- Vue2 jsx
export default {
name: "juejin",
props: {
value: {
type: String,
default: "",
},
},
render(h) {
return (
//这里就是识别一个组件命 然后把attrs全部都当做参数传给组件 然后业务组件遵循一个内部处理 内部消化的原则
//事件啥的最好都是业务组件内部处理,父组件只负责传值 这个是比较好的状态
<div class="juejin">{(h(this.value), { props: { ...this.$attrs } })}</div>
);
},
};
2.Vue2 vue
我上面的jsx其实实现的也是这个功能 这个是vue的内置组件 可以看看官方文档就好
3.vue3 jsx or tsx
import { defineComponent, resolveComponent, h } from "vue";
import { Vue } from "vue-class-component";
interface Itest extends Vue {
func1: void;
}
const test = defineComponent({
name: "Test",
props: {
value: {
type: String,
default: "",
},
},
setup(pros,con) {
return () => {
//resolveComponent这个方法是用来寻找组件 你传入一个名字他会帮你寻找一个已经注册的组件
//然后vue3 没有this 所以从上下文里面拿到attrs
//js的话直接拿去赋值 别复制类型就行 其他是一样的
h(resolveComponent(pros.value), { ...con.attrs });
};
},
});
export default test;
如果针对这个情况在看的各位还有更好的方法,请留言告诉我,谢谢!!!共同学习 共同成长
下面来看一下利用对象或map做转发
export default {
name: "juejin",
props: {
value: {
type: String,
default: "",
},
},
methods: {
//组件a
renderA() {
return <div>我是组件A</div>;
},
//组件a
renderB() {
return <div>我是组件B</div>;
},
//组件a
renderC() {
return <div>我是组件C</div>;
},
//通过对象来分发
isRenderComponents(key) {
const componentsObj = {
a: this.renderA,
b: this.renderB,
c: this.renderC,
};
if (componentsObj[key]) {
//这样去执行就好
return componentsObj[key]();
}
//如果你需要默认展示的组件
return this.renderA();
},
},
render() {
const juejinArr = [
{
key: "a",
},
{
key: "b",
},
{
key: "c",
},
{
key: "d", //a
},
{
key: "e", //a
},
{
key: "f", //a
},
];
return (
<div class="juejin">
//这个就利用的对象的key->value 结构来做映射 用map也是一样
{juejinArr.map((i) => {
return this.isRenderComponents(i.key);
})}
</div>
);
},
};
//用一个业务系统的同一个页面 这个页面恐怖的到了5200行(加上css)
//但凡你在if里面写出了return我也不说啥...
//解决方案
const currentServiceNameObj = {
a:"1",
b:"2",
c:"3",
d:"4",
e:"5",
f:"6",
g:"7",
h:"8",
i:"9",
}
//严谨的小伙伴可以在else里面写出一个提示
if (currentServiceNameObj[this.currentService.name]) {
params.serviceId = currentServiceNameObj[this.currentService.name]
}
同理可证 如果你有一个特别复杂的页面 你可以通过多个组件来拼接 然后通过对象来进行转发(利用jsx)
下面来看下面这种情况---如果利用函数这个一等公民来简化业务
//这个是我从template标签里面抽出来的 已经做了优化了
/**
* v-if="item.trackStatus === 1
&& (item.Code === 'CHECK_END'
|| item.Code === 'GROUP_REVIEW'
|| item.Code === 'PROJECT_REVIEW'
|| item.Code === 'CHECK_MODIFY'
|| item.Code === 'PRE_CHECK'
|| item.Code === 'PRE_CHECK2'
|| item.Code === 'PRE_CHECK3'
|| item.Code === 'CHECK'
|| item.Code === 'CHECK2'
|| item.Code === 'CHECK3'
|| item.Code === 'CHECK_1'
|| item.Code === 'ENGINE_CHECK1'
|| item.Code === 'ENGINE_CHECK2'
|| item.Code === 'ENGINE_CHECK3'
|| item.Code === 'ENGINE_CHECK4'
|| item.Code === 'ENGINE_CHECK5'
|| item.Code === 'ENGINE_CHECK_1'
|| item.Code === 'SAFE_CHECK'
*/
//本来我是不知道这里的,直到有一天测试小姐姐和我说 新增了几条数据,但是之前的都是好的,新增的全部用不了,
//让我看看 我就看到了这里 真的 当时血压一下就起来,吃了五片降压药才缓过来,目前这个地方就是 只要超过5就炸
//项目里面有几十个地方全部用的这个,给你们看看修改之后的样子 如果有更好的条件请联系我
function setBtnShowStatus (nodeCode) {
if (nodeCode) {
const nodeCodeArr = [
'CHECK_END',
'GROUP_REVIEW',
'PROJECT_REVIEW',
'CHECK_MODIFY',
'CONFIRM',
'SAFE_CHECK']
const engineStatus = nodeCode.includes('ENGINE_CHECK')
const nodeCodeStatus = nodeCodeArr.includes(nodeCode)
const preStatus = nodeCode.includes('PRE_CHECK')
const checkStatus = nodeCode.includes('CHECK')
if (engineStatus || nodeCodeStatus || preStatus || checkStatus) {
return true
} else {
return false
}
}
return false
}
//修改完成后 只需要调用这个方法就可以 举例:<div v-if=setBtnShowStatus('CHECK_END')>1</div>
//大概就是这样 只需要把这里改了 这些个一样的地方就全部生效 也不需要到处找,也不至于页面全是1000,2000行
//接手到这种代码,我的内心是拒绝的.
总结
不想把有限的职业生涯浪费在无尽的业务中,需要不断的去学习和反思自己的工作内容和善于记笔记(我用的语雀网页版).一点点个人心得.
1.学习源码要学习思想,有哪些是写的很好的方法,可以借鉴的,关联到自己的工作,技术是为人服务的!
2.多记笔记,你的大脑再厉害,总会有忘记的时候,不如记下来,然后遇到问题,感觉解决过就去翻一下笔记.
3.放松自己的头脑,不要给自己太多的压力,人只要活着总会遇到好事.
4.多学习,有目的的学习,然后一定一定一定要实践,要把你学到的东西在工作上用起来,哪怕就你一个人,你也要用,这样才能不断的巩固加深,报错就去解决就好了. 解决报错也是学习进步的一个很好的方法.
5.每天都会写很多业务,尝试用不同的方法去解决问题,不懂就看mdn,不懂就去搜索一下,解决完了回头在看看能不能继续写的更好,静下心来不断的去优化自己写的内容,多要求自己一些.
6.做好技术积累,人家干的又好又快可能只是人家写的多,技术积累的够(我自己会把自己写过的组件都放在一个文件夹里面,然后上传到git,不断去更新,不断去优化,周六日想起来也会继续去优化.),你存个两年,你就发现,大部分的功能你都已经实现过了,剩下就不断的优化过程.
7.开发时间多要几天,鬼知道有啥疑难杂症等着你,多一些时间也可以多一些思考的时间,人的精力是有限的,除了工作还有大好的世界等着你看呢!!
8.学一段时间(学的时候一定要记笔记,存笔记,别光靠脑子),玩一段时间,天天学,天天加班,人容易丧失生气,对啥都提不起劲儿,这个状态是很差的,要好好调节.
9.健身,锻炼身体,有时候说话不一定好使,该揍就揍,该骂就骂,如果身体不好可能会被反杀,得不偿失!!!
10.工作只是你生活的一部分,不是全部,老板也是人,正常对待就好.讲个笑话:我没有工作了,但是老板多的是.