跳至主要內容
🚀超详细解读vue3.2源码——组件渲染流程

欢迎关注我的公众号:萌萌哒草头将军

入口->全局初始化->生成 vnode->挂载

入口函数

export const createApp = (...args) => {
  // 1.创建实例
  const app = ensureRenderer().createApp(...args);

  // 2. 重写实例的 mount 方法
  const { mount } = app;
  app.mount = (containerOrSelector) => {
    const container = normalizeContainer(containerOrSelector);
    if (!container) return;

    const component = app._component;
    if (!isFunction(component) && !component.render && !component.template) {
      // __UNSAFE__
      // Reason: potential execution of JS expressions in in-DOM template.
      // The user must make sure the in-DOM template is trusted. If it's
      // rendered by the server, the template should not contain any user data.
      component.template = container.innerHTML;
      // 2.x compat check
      if (__COMPAT__ && __DEV__) {
        for (let i = 0; i < container.attributes.length; i++) {
          const attr = container.attributes[i];
          if (attr.name !== "v-cloak" && /^(v-|:|@)/.test(attr.name)) {
            compatUtils.warnDeprecation(
              DeprecationTypes.GLOBAL_MOUNT_CONTAINER,
              null
            );
            break;
          }
        }
      }
    }

    // clear content before mounting
    container.innerHTML = "";
    const proxy = mount(container, false, resolveRootNamespace(container));
    if (container instanceof Element) {
      container.removeAttribute("v-cloak");
      container.setAttribute("data-v-app", "");
    }
    return proxy;
  };

  return app;
};

萌萌哒草头将军大约 7 分钟前端Vue
Vue3使用hook封装常见的几种异步请求函数场景,让开发更加丝滑🚀🚀🚀

文章同步在公众号:萌萌哒草头将军,欢迎关注

今天继续上次的内容,使用hook封装几种的异步请求函数场景。

🚀 立即请求函数

我们期望的场景是,

  • 初始化一个请求函数,然后根据初始参数,立即发送请求
  • 返回请求结果,并且返回请求回调函数,方便我们根据新的参数再次调用
  • 要求返回值包含加载中状态,错误信息以及正常的数据类型。

萌萌哒草头将军大约 4 分钟前端JavaScriptVue
🚀🚀vue3自定义指令实践

文章首发公众号:萌萌哒草头将军,欢迎关注

🚀 关键接口介绍

最近想体验下自定义指令功能,看了看文档和 vue2 差异不大,语法如下:

const myDirective = {
// 在绑定元素的 attribute 前 
// 或事件监听器应用前调用
created(el, binding, vnode, prevVnode) 
{ // 下面会介绍各个参数的细节 }, 
// 在元素被插入到 DOM 前调用
beforeMount(el, binding, vnode, prevVnode) {},
// 在绑定元素的父组件
// 及他自己的所有子节点都挂载完成后调用
mounted(el, binding, vnode, prevVnode) {},
// 绑定元素的父组件更新前调用
beforeUpdate(el, binding, vnode, prevVnode) {},
// 在绑定元素的父组件
// 及他自己的所有子节点都更新后调用
updated(el, binding, vnode, prevVnode) {},
// 绑定元素的父组件卸载前调用
beforeUnmount(el, binding, vnode, prevVnode) {},
// 绑定元素的父组件卸载后调用
unmounted(el, binding, vnode, prevVnode) {} }

萌萌哒草头将军大约 5 分钟前端JavaScriptVue
Vue3使用hook封装媒体查询和事件监听,使Vue的开发更加丝滑🚀🚀🚀

文章同步在公众号:萌萌哒草头将军,欢迎关注

js中媒体查询的主要方法是使用window对象下的matchMedia对象,查询语句和CSS媒体查询一样。

封装媒体查询

首先我们先看监听系统主题色的例子

  • 首先创建媒体查询对象
  • 根据查询结果设置对应的值
  • 然后建立监听事件,并且在退出时取消监听
export const useTheme = () => {

  // 首先创建媒体查询对象
  const themeMedia = matchMedia("(prefers-color-scheme: light)")
  // 根据查询结果设置对应的值
  const theme = ref(themeMedia.matches ? 'light' : 'dark')

  const onChange = (e: MediaQueryListEvent) => theme.value = e.matches ? 'light' : 'dark'
  
  watchEffect((onCleanup) => {
    //  然后建立监听事件
    themeMedia.addEventListener('change', onChange)
    // 并且在退出时取消监听
    onCleanup(() => themeMedia.removeEventListener('change', onChange))
  })

  return theme;
}

萌萌哒草头将军大约 3 分钟前端JavaScriptVue
🎉一个demo体验Vue3.3所有新功能🎉

最新文章发布在公众号:萌萌哒草头将军,个人:SunBoy_mmdctjj,欢迎关注,最近关注有🎁,送五本JavaScript的书~

Vue3.3已经发布一个月了,今天我和大家体验下最新功能

💎 准备工作

🚗 创建项目并运行

创建完项目后记得下载最新的包

// 创建
npm create vite vue-demo --template vue-ts
// 下载依赖
cd vue-demo
npm i
// 更新到最新版本
npm i vue@3.3
// 运行
npm run dev

萌萌哒草头将军大约 3 分钟前端JavaScriptVue
Vue3优雅的监听localStorage变化

文章同步在公众号: 萌萌哒草头将军

最近公众号有🎁,欢迎关注了解

最近在研究框架,也仔细用了Vue3一些功能,今天分享一次我的实践:

Vue3如何监听localStorage的变化。


萌萌哒草头将军大约 2 分钟前端JavaScriptVue
vue组件通信总结

11月份的面试越来越觉得自己学的不够踏实和深入。现在实习了有空总结下

京东前端实习一道面试题:vue中组件通信接口有哪些,除了props和$emit?

注意是接口,我说了vuex和localStorage,立马就被否决了

一、父子组件通信

1.props和$emit

props最常见的父子通信接口,但是props是单向数据流的形式:父级 prop 的更新会向下流动到子组件中,但是反过来则不行

此时需要借助vue提供的事件监听机制来完成子组件向父组件数据流动更新的功能。
在子组件使用$emit定义监听事件名称,在父组件使用v-on监听该事件,在事件中改变父组件的状态。


萌萌哒草头将军大约 9 分钟前端Vue