vue封装单文件弹窗组件_vue

docutment.body.appendChild(div)
//渲染组件到界面上
const app = createApp(MessageBox,{
//传递事件 传递消息 执行关闭弹窗
msg,
onClick(){
onclick(()=>{
//关闭弹窗即 移除div
app.remove(div)
})
}
});
// 挂载div
app.mount(div)
}


MessageBox 为挂载的组件


这时候乍一看 这不就是 新建个 组件只不过是通过函数调用挂载到页面吗。


别着急接着往下看


       一个程序首先要满足高内聚低耦合 到目前为止 一个弹框实际上还是使用了两个文件 一个js文件一个vue文件  一个功能使用两个文件 显然是违背高内聚了,在这里的MessageBox无非就是一个组件,那该怎么想办法把组件文件 写到js文件里面来呢?这就考验大家对vue组件的理解程度了,脱离了单文件如何写代码呢。


      其实也不难,要明白组件的本质是什么呢?很明显组件的本质就是一个对象!一个配置对象,始终要记住,万物皆对象。脱离单文件我们直接把这个对象写到js里不就实现了 这个时候就需要使用的[render]( )函数了 r[ender渲染JSX]( )具体可以去官方文档一探究竟



> 
> Vue 提供了一个 `h()` 函数用于创建 vnodes:`h()` 是 **hyperscript** 的简称——意思是“能生成 HTML (超文本标记语言) 的 JavaScript”。这个名字来源于许多虚拟 DOM 实现默认形成的约定。一个更准确的名称应该是 `createVnode()`,但当你需要多次使用渲染函数时,一个简短的名字会更省力。
> 
> 
> 


 需要注意的是在JSX语法里是不支持大胡子语法的需要使用react那种写法



const MessageBox = {
props: {
//组件配置例如函数参数等
msg: {
type: String,
required: true
}
},
//ctx指上下文
render(ctx) {
//通过上下文拿到属性和emit方法
const { $props, KaTeX parse error: Expected 'EOF', got '}' at position 6: emit }̲ = ctx; re…props.msg} 关闭
}
};


 关于css样式 除了行内样式  还可以参照react  CSS in JS  随便找一个工具库能在js里写css即可!



#### 全部代码



const MessageBox = {
props: {
//组件配置例如函数参数等
msg: {
type: String,
required: true
}
},
//ctx指上下文
render(ctx) {
//通过上下文拿到属性和emit方法
const { $props, KaTeX parse error: Expected 'EOF', got '}' at position 6: emit }̲ = ctx; re…props.msg} 关闭
}
};
export function showMsg(msg, onClick) {
//在页面创建一个DIV元素
const div = docutment.createElement(‘div’)
docutment.body.appendChild(div)
//渲染组件到界面上
const app = createApp(MessageBox,{
//传递事件 传递消息 执行关闭弹窗
msg,
onClick(){
onclick(()=>{
//关闭弹窗即 移除div
app.remove(div)
})
}
});
// 挂载div
app.mount(div)
}


       到这 就实现了一个js文件封装好vue弹窗的功能了,你可以在任何地方使用这个弹窗,不仅仅是在组件,甚至你可以在js里面例如发送请求里调用这个方法来实现弹窗。



> 
>        目前实现的功能是比较简陋的,但是整体实现的思想逻辑和基础架子已经有了,大家可以自行发挥加上更加完善的功能。
> 
> 
> 
#### 总结

*   对于框架原理只能说个大概,真的深入某一部分具体的代码和实现方式就只能写出一个框架,许多细节注意不到。

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

*   算法方面还是很薄弱,好在面试官都很和蔼可亲,擅长发现人的美哈哈哈...(最好多刷一刷,不然影响你的工资和成功率????)

*   在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。



*   要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!



![](https://img-blog.csdnimg.cn/img_convert/41a409bca685b4ea0e0aa1a5589c3e09.png)



第一次跳槽十分忐忑不安,和没毕业的时候开始找工作是一样的感受,真的要相信自己,有条不紊的进行。**如果有我能帮忙的地方欢迎随时找我,比如简历修改、内推、最起码,可以把烦心事说一说**,人嘛都会有苦恼的~

祝大家都有美好的未来,拿下满意的 offer。
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基本的组件封装代码。代码中使用的是Element UI库中的Dialog组件,你可以根据自己的需求进行修改和定制。 ``` <template> <el-dialog :title="title" :visible.sync="visible" :modal="modal" :width="width" :fullscreen="fullscreen" :lock-scroll="lockScroll" :custom-class="customClass" :show-close="showClose" :before-close="beforeClose" > <slot></slot> </el-dialog> </template> <script> export default { name: 'MyDialog', props: { title: { // 标题 type: String, default: '' }, visible: { // 是否显示 type: Boolean, default: false }, modal: { // 是否为模态 type: Boolean, default: true }, width: { // 宽度 type: String, default: '50%' }, fullscreen: { // 是否全屏显示 type: Boolean, default: false }, lockScroll: { // 是否锁定滚动条 type: Boolean, default: true }, customClass: { // 自定义类名 type: String, default: '' }, showClose: { // 是否显示关闭按钮 type: Boolean, default: true }, beforeClose: { // 关闭前的回调函数 type: Function, default: () => {} } } } </script> ``` 这是一个非常基础的组件,你可以根据自己的需求进行扩展和修改。在使用时,你需要在父组件中引入该组件,并使用v-model绑定visible属性来控制的显示和隐藏状态。 ``` <template> <div> <el-button @click="visible = true">打开</el-button> <my-dialog v-model="visible" title="标题"> <p>这是内容</p> </my-dialog> </div> </template> <script> import MyDialog from './MyDialog.vue' export default { components: { MyDialog }, data() { return { visible: false } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值