vue3实现alert自定义的plugins

技术环境:
vue3实现一个alert的plugins
代码目录如下:

1. plugins/message/index.vue
<template>
  <div class="default-message">
    <div class="default-message-content">
      <div class="default-message-title">{{title}}</div>
      <div class="default-message-value" v-html="content"></div>
      <div class="default-message-btns">
        <div class="default-message-cancle default-message-btn"
          v-if="cancletext" :style="setcanclecolor()"
          @click.prevent.stop="handlecancel">
          {{cancletext}}
        </div>
        <div class="default-message-submit default-message-btn"
          :style="setokcolor()" @click.prevent.stop="handleok">
          {{oktext}}
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { definecomponent } from "vue";
export default definecomponent({
  name: "message",
  props: {
    // 标题
    title: {
      type: string,
      default: "提示",
    },
    // 内容
    content: {
      type: string,
      default: "",
      required: true,
    },
    // 确定按钮文字
    oktext: {
      type: string,
      default: "确定",
    },
    // 确定按钮文字颜色
    oktextcolor: {
      type: string,
      default: "#26a2ff",
    },
    // 取消按钮文字
    cancletext: {
      type: string,
      default: "",
    },
    // 取消按钮文字颜色
    cancletextcolor: {
      type: string,
      default: "#999",
    },
    // 成功回调
    success: {
      type: function,
    },
    // 失败回调
    fail: {
      type: function,
    },
  },
  setup(props) {
    // ok的颜色
    const setokcolor = () => {
      return `color: ${props.oktextcolor}`;
    };
    // 取消的颜色
    const setcanclecolor = () => {
      return `color: ${props.cancletextcolor}`;
    };
    // 移除当前组件
    function removemodal() {
      const modeldom = document.body.queryselector(
        `.__default__container__message__`
      );
      if (modeldom) {
        document.body.removechild(modeldom);
      }
    }
    const handlecancel = () => {
      removemodal();
      props.fail && props.fail();
    };
    const handleok = () => {
      removemodal();
      props.success && props.success();
    };
    return {
      setokcolor,
      setcanclecolor,
      handleok,
      handlecancel,
    };
  },
});
</script>
<style scoped lang="scss">
.default-message {
  position: fixed;
  right: 0;
  top: 0;
  bottom: 0;
  left: 0;
  z-index: 1000;
  background: rgba($color: #000000, $alpha: 0.3);
  .default-message-title {
    padding-top: 15px;
    text-align: center;
    font-size: 18px;
    font-weight: 700;
    color: #333;
  }
  .default-message-content {
    width: 85%;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate3d(-50%, -50%, 0);
    background-color: #fff;
    border-radius: 6px;
    transition: all 0.2s ease-in;
    color: #999;
    font-size: 18px;
  }
  .default-message-value {
    padding: 10px 20px 15px;
    min-height: 36px;
    position: relative;
    color: #999;
    text-align: center;
    line-height: 36px;
  }
  .default-message-btns {
    // border-top: 1px solid #ddd;
    display: flex;
    height: 46px;
    position: relative;
    &:after {
      position: absolute;
      content: "";
      display: inline-block;
      left: 0;
      right: 0;
      top: 0;
      height: 1px;
      transform: scaley(0.5);
      background: #ddd;
    }
    .default-message-btn {
      flex: 1;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 16px;
      padding: 0 3px;
    }
    .default-message-cancle {
      position: relative;
      &:after {
        position: absolute;
        content: "";
        display: inline-block;
        top: 0;
        right: 0;
        bottom: 0;
        width: 1px;
        transform: scalex(0.5);
        background: #ddd;
      }
    }
  }
  @keyframes fadein {
    from {
      opacity: 0;
    }
    to {
      opacity: 1;
    }
  }
}
</style>
2. plugins/message/index.js
import { createvnode, render } from "vue";
import messageconstructor from "./index.vue";
const $message = function(options) {
  // 创建div
  const container = document.createelement("div");
  container.classname = `__default__container__message__`;
  //创建虚拟节点
  const vm = createvnode(messageconstructor, options);
  //渲染虚拟节点
  render(vm, container);
  document.body.appendchild(container);
};
export default {
  //组件注册
  install(app) {
    app.config.globalproperties.$message = $message;
  }
};3. main.js
import { createapp } from "vue";
import router from "./router";
import store from "./store";
import app from "./app.vue";
import message from "./assets/plugins/message";
const app = createapp(app);
app.use(message);
app.use(store);
app.use(router);
app.mount("#app", { username: "123 });4. 使用方法
import { getcurrentinstance } from "vue";
setup(props) {
	const { ctx } = getcurrentinstance();
	
	  ctx.$message({
        content: "您确定要退出吗?",
        cancletext: "取消",
        success: (res) => {
          	console.log(res);
        },
        fail: (err) => {
			console.log(err);
		},
      });
}5. 升级改造
由于当前 ctx.$message 仅仅只在setup里面使用, 如果希望在unit.js或者其他js文件中使用? 下面开始我的表演
- 5.1 js文件中需要使用vue的app实例对象
// main.js export const app = createapp(app);
- 5.2 js文件引入app实例
// util.js
import { app } from "../../main";
/**
 * @params title string
 * @params content string
 * @params oktext string
 * @params oktextcolor string
 * @params cancletext string
 * @params cancletextcolor string
 * @return promise
 */
export function showmessage(params) {
  return new promise((resolve, reject) => {
    app.config.globalproperties.$message({
      ...params,
      success: () => {
        return resolve("is:ok");
      },
      fail: () => {
        return reject("is:cancle");
      }
    });
  });
}- 5.3 使用方法
import { showmessage } from "../../assets/scripts/util";
setup(){
	 const logout = () => {
      showmessage({ content: "您确定要退出吗?", cancletext: "取消" })
        .then((res) => {
          console.log(res);
        })
        .catch((err) => {
          console.log(err);
        });
    };
   return { logout };
}文档说明:
| 字段 | 说明 | required | type | 默认 | 
|---|---|---|---|---|
| title | 标题 | false | string | 提示 | 
| content | 内容 | true | string | |
| oktext | 确定按钮文字 | false | string | 确定 | 
| oktextcolor | 确定按钮文字颜色 | false | string | #26a2ff | 
| cancletext | 取消按钮文字 | false | string | |
| cancletextcolor | 取消按钮文字颜色 | false | string | #999 | 
| success | 成功回调 | false | function | |
| fail | 失败回调 | false | function | 
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
 
             我要评论
我要评论 
                                             
                                             
                                             
                                            
发表评论