vue升级题

不熟悉的:

2,

3.你用过befcoreDetory 吗?清除定时器,第一个和第二个再看一下

实例加载完成是在哪个生命周期--beforecreate

7.父子组件生命周期执行顺序?为什么这么渲染?场景

8.简单描述每个周期具体适合那些场景?(需要在问)

只是钩子,触发事件

每个生命周期的钩子函数去做这个事情,不是执行

你卸载的时候会触发这个钩子

9

10

13.v都是语法糖;v-model只能用一次,sync可以父子组件的数据达到同步

16:v-on;v-bind的原理

18

21.vue-loader:解析vue文件;template-解析成html;script标签解析成js,style里的东西解析成css

是webpack中的

、允许用单文件

怎么实现

diff-vdom看下源码

22.diff算法用了key;

24:

26:

27:

28
30

33.Vue的路由实现:hash模式和history模式

35-37

38

40

41:active-class 

说下route-link原理:点击跳转;写个div 加一个点击事件原理;to:跳转到的页面

42:keep-live最多能缓存几个;缓存的这个机制是怎么实现的

标签页缓存

-50

1.vue怎么实现的减少了dom的操作,因为我们只需要关注数据就可以

https://blog.csdn.net/qq_40055200/article/details/134630413?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22134630413%22%2C%22source%22%3A%22qq_40055200%22%7D
 

vue 双向绑定的源码实现 

这段代码实现了一个简化版的Vue双向绑定,主要包括以下几个部分:

  • defineReactive 函数:使用 Object.defineProperty 定义对象的属性,实现数据的响应式绑定。
  • observe 函数:遍历对象的属性,对每个属性调用 defineReactive 进行响应式绑定。
  • compile 函数:编译模板,找到带有 v-model 属性的节点,并监听其输入事件,实现双向绑定。
  • compileNode 函数:编译文本节点,将模板中的 {{}} 表达式解析为对应的数据,并创建一个 Watcher 对象进行监听。
  • compileFragment 函数:递归遍历模板中的所有节点,调用 compileNode 进行编译。
  • Vue 构造函数:初始化 Vue 实例,将 data 数据进行响应式绑定,并编译模板。
  • Watcher 对象:观察者对象,用于监听数据变化并更新视图。
  • Dep 对象:依赖收集对象,用于管理和通知所有的观察者对象。
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter() {
      // 在读取属性值时,进行依赖收集
      // ...
      return val;
    },
    set: function reactiveSetter(newVal) {
      if (newVal === val) {
        return;
      }
      // 在更新属性值时,触发更新
      // ...
      val = newVal;
    }
  });
}

function observe(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return;
  }

  Object.keys(obj).forEach(function(key) {
    defineReactive(obj, key, obj[key]);
  });
}

function compile(node, vm) {
  if (node.nodeType === 1) {
    var attrs = node.attributes;
    for (var i = 0; i < attrs.length; i++) {
      if (attrs[i].nodeName === 'v-model') {
        var exp = attrs[i].nodeValue;
        node.value = vm[exp];
        node.addEventListener('input', function(e) {
          // 监听输入事件,更新数据
          vm[exp] = e.target.value;
        });
        node.removeAttribute('v-model');
      }
    }
  }
}

function compileNode(node, vm) {
  var reg = /\{\{(.*)\}\}/;
  if (node.nodeType === 1) {
    compile(node, vm);
  } else if (node.nodeType === 3 && reg.test(node.nodeValue)) {
    var exp = RegExp.$1;
    exp = exp.trim();
    new Watcher(vm, exp, function(value) {
      // 监听数据变化,更新视图
      node.nodeValue = value;
    });
  }
}

function compileFragment(fragment, vm) {
  var childNodes = fragment.childNodes;
  Array.prototype.slice.call(childNodes).forEach(function(node) {
    compileNode(node, vm);
    if (node.childNodes && node.childNodes.length > 0) {
      compileFragment(node, vm);
    }
  });
}

function Vue(options) {
  this.$options = options;
  this._data = options.data;
  observe(this._data);

  var compiled = document.createDocumentFragment();
  this.$el = document.querySelector(options.el);
  compiled.appendChild(this.$el.cloneNode(true));
  compileFragment(compiled, this);

  this.$el.parentNode.replaceChild(compiled, this.$el);
}

function Watcher(vm, exp, cb) {
  this.vm = vm;
  this.exp = exp;
  this.cb = cb;
  this.value = this.get();
}

Watcher.prototype = {
  update: function() {
    var newVal = this.vm[this.exp];
    if (newVal !== this.value) {
      this.value = newVal;
      this.cb.call(this.vm, newVal);
    }
  },
  get: function() {
    Dep.target = this;
    var value = this.vm[this.exp];
    Dep.target = null;
    return value;
  }
};

function Dep() {
  this.subs = [];
}

Dep.prototype = {
  addSub: function(sub) {
    this.subs.push(sub);
  },
  notify: function() {
    this.subs.forEach(function(sub) {
      sub.update();
    });
  }
};

Dep.target = null;

v-on和v-bind的原理

v-on

v-on指令的原理是利用DOM事件监听器,

v-bind指令的原理是在编译阶段对指令进行解析,并将指令所定义的属性绑定到对应的DOM节点上。当数据发生变化时,Vue.js会自动更新该属性的值。

router-link怎么实现的

route-link是一种在Web应用程序中实现路由导航的组件。它通常用于构建单页应用程序(SPA),其中页面内容的切换是通过动态加载和渲染组件来实现的,而不是通过传统的页面刷新。

route-link的实现方式可能略有不同,具体取决于所使用的前端框架或库。以下是一些常见的实现方式:

  1. 使用HTML的标签:在HTML中,可以使用标签来创建链接,并将其href属性设置为目标URL。当用户点击这个链接时,浏览器会跳转到该URL并加载新的页面。在单页应用程序中,可以通过JavaScript的事件监听器来捕获标签的点击事件,并阻止默认的页面跳转行为,然后执行自定义的路由导航逻辑,例如使用浏览器的History API来切换页面内容。

  2. 使用前端框架的路由库:许多前端框架或库都提供了自己的路由功能和相应的组件。例如,在Vue.js中,可以使用vue-router库来实现路由导航。vue-router提供了组件,它会生成带有正确路由配置的标签,并处理路由导航的细节,例如高亮当前活动的链接、阻止重复点击等。

  3. 自定义路由导航组件:在某些情况下,开发人员可能需要自己实现路由导航组件。这可以通过使用框架提供的基础路由功能(例如浏览器的History API)和事件监听器来完成。开发人员可以创建一个自定义组件,使用HTML的标签或其他交互元素,在点击事件中执行路由导航逻辑。

无论使用哪种方式,route-link的核心目标是实现可靠的路由导航功能,使用户能够在单页应用程序中无缝切换页面内容,提供良好的用户体验。

 

2.v-model怎么实现的

3.

你可能感兴趣的:(前端)