精华内容
下载资源
问答
  • Vue 初始化 执行过程

    2021-01-09 17:39:52
    Vue 初始化 执行过程 先在platforms 下的 entry-runtime-with-compile.js 调用 Vue.$mountd 的获取el对象, 挂载mount方法 ,将Vue的模块导出 找到 core/instance/index.js ,获取 vue的构造函数, 初始化Vue 上的...

    Vue 初始化 执行过程

    先在platforms 下的 entry-runtime-with-compile.js

    调用 Vue.$mountd 的获取el对象, 挂载mount方法 ,将Vue的模块导出

    找到 core/instance/index.js ,获取 vue的构造函数,

    初始化Vue 上的静态方法,例如 set,delete,nextTick

    初始化Vue 上的实例成员,就是在Vue的原型上混入相应的成员,进行patch方法进行初次的渲染到el对象上,
    例如 d a t a , data, data,props, o n , on, onemit等方法,使用的就是事件订阅模式

    1.调用_init方法,向Vue上挂载
    _init函数 就相当于是整个Vue的入口,init内部调用了$mount,进行模板或者render函数的挂载

    1. 在mount内部,调用mountComponent,定义对应的beforeComponent,定义updateCompoennt,进行dom渲染

    3.之后创建watcher对象,对get进行数据监听,返回vm对象

    1. watcher对象创建后,调用get,调用updateComponent,调用render方法创建Vnode,进行VNode的编译

    最后进行vm.update的patch函数,挂载dom节点

    展开全文
  • 使用AJAX初始化Vue数据

    2021-08-06 05:44:35
    我正在尝试使用AJAX查询的JsonResult中的数据填充Vue。当我从我的视图模型对...这是我的代码的样子:使用AJAX初始化Vue数据var allItems;// = @Html.Raw(Json.Encode(Model));$.ajax({url: '@Url.Action("GetItems"...

    我正在尝试使用AJAX查询的JsonResult中的数据填充Vue。当我从我的视图模型对它进行编码时,我的Vue接收数据就好了,但当我尝试使用AJAX检索它时,我的Vue没有收到数据。这是我的代码的样子:使用AJAX初始化Vue数据

    var allItems;// = @Html.Raw(Json.Encode(Model));

    $.ajax({

    url: '@Url.Action("GetItems", "Settings")',

    method: 'GET',

    success: function (data) {

    allItems = data;

    //alert(JSON.stringify(data));

    },

    error: function (error) {

    alert(JSON.stringify(error));

    }

    });

    var ItemsVue = new Vue({

    el: '#Itemlist',

    data: {

    Items: allItems

    },

    methods: {

    },

    ready: function() {

    }

    });

    ItemYear
    {{Item.DisplayName}}{{Item.Year}}

    这是与所有适当的包括。我知道@Url.Action("GetItems", "Settings")返回正确的URL,并且数据按预期返回(通过成功函数中的警报测试(请参阅AJAX中的成功函数中的注释)。如下所示填充它:var allItems = @Html.Raw(Json.Encode(Model));有效,但AJAX查询不适用。我是不是做错了什么?

    +0

    你必须后更新视图的数据项你已收到数据。请注意,ajax是异步的(因此名称),所以您只会在'success'回调函数中拥有数据! –

    +0

    我该怎么做?我不能做ItemsVue.data.Items吗?我不知道如何更新它... –

    +0

    我想我可以在'success'回调函数中创建我的Vue! –

    展开全文
  • vue初始化watch

    2021-07-27 10:40:30
    分析源码不求行行都懂,大致分析下watch得执行原理 在vue源码中找到initWatch 基本得逻辑就是initWatch —> createWatcher() ----> vm.$watch() ----> new Watcher(); **1.initWatch ** function ...

    分析源码不求行行都懂,大致分析下watch得执行原理

    • 在vue源码中找到initWatch
      在这里插入图片描述
      基本得逻辑就是initWatch —> createWatcher() ----> vm.$watch() ----> new Watcher();

    **1.initWatch **

    function initWatch (vm: Component, watch: Object) {
      for (const key in watch) {
        const handler = watch[key]
        if (Array.isArray(handler)) {
          for (let i = 0; i < handler.length; i++) {
            createWatcher(vm, key, handler[i])
          }
        } else {
          createWatcher(vm, key, handler)
        }
      }
    }
    

    这个方法中其实就是将watch看成一个对象去循环处理它,最终执行createWatcher()

    2.createWatcher()

    function createWatcher (
      vm: Component,
      expOrFn: string | Function,
      handler: any,
      options?: Object
    ) {
      if (isPlainObject(handler)) {
        options = handler
        handler = handler.handler
      }
      if (typeof handler === 'string') {
        handler = vm[handler]
      }
      return vm.$watch(expOrFn, handler, options)
    }
    

    createWatcher前面部分代码就是针对watch得不同写法做了处理,比如字符串写法,函数写法,对象写法。最后调用了$watch得方法

    3.$watch

    Vue.prototype.$watch = function (
        expOrFn: string | Function,
        cb: any,
        options?: Object
      ): Function {
        const vm: Component = this
        if (isPlainObject(cb)) {
          return createWatcher(vm, expOrFn, cb, options)
        }
        options = options || {}
        options.user = true
        const watcher = new Watcher(vm, expOrFn, cb, options)
        if (options.immediate) {
          try {
            cb.call(vm, watcher.value)
          } catch (error) {
            handleError(error, vm, `callback for immediate watcher "${watcher.expression}"`)
          }
        }
        return function unwatchFn () {
          watcher.teardown()
        }
      }
    

    w a t c h 这 个 方 法 中 注 意 , 它 得 核 心 是 n e w W a t c h e r ( v m , e x p O r F n , c b , o p t i o n s ) , 我 们 可 以 往 上 推 看 到 参 数 一 次 是 t h i s , 字 符 串 , 执 行 逻 辑 , u n d e f i n e d , 注 意 : 所 有 实 现 w a t c h 得 原 理 就 在 这 个 W a t c h e r 中 实 现 。 返 回 w a t c h e r . t e a r d o w n ( ) , 是 去 除 监 听 , 是 为 了 在 我 们 代 码 中 直 接 写 t h i s . watch这个方法中注意,它得核心是 new Watcher(vm, expOrFn, cb, options),我们可以往上推看到参数一次是 this,字符串,执行逻辑,undefined, 注意:所有实现watch得原理就在这个Watcher中实现。 返回 watcher.teardown(),是去除监听,是为了在我们代码中直接写this. watchnewWatcher(vm,expOrFn,cb,options)this,undefinedwatchWatcherwatcher.teardown()this.watch()得时候不用去执行监听逻辑。

    4.new Watcher
    1.在constructor中有这一段逻辑,会执行parsePath方法

    if (typeof expOrFn === 'function') {
          this.getter = expOrFn
        } else {
          this.getter = parsePath(expOrFn)
          if (!this.getter) {
            this.getter = noop
            process.env.NODE_ENV !== 'production' && warn(
              `Failed watching path: "${expOrFn}" ` +
              'Watcher only accepts simple dot-delimited paths. ' +
              'For full control, use a function instead.',
              vm
            )
          }
        }
    

    2.parsePath方法返回得是一个函数(这种用法为柯里化函数),返回得函数中都是要去访问对应data得 get set,方法得,这时候就会做一个依赖收集,和派发更新。

    export function parsePath (path: string): any {
      if (bailRE.test(path)) {
        return
      }
      const segments = path.split('.')
      return function (obj) {
        for (let i = 0; i < segments.length; i++) {
          if (!obj) return
          obj = obj[segments[i]]
        }
        return obj
      }
    }
    

    3.接着往下看,是执行get(),pushTarget(this)会将Dep.target设置为当前得watch-watcher,然后执行getter,上面说了getter返回得是一个函数,里面会做依赖收集和派发更新,这个时候watch-watcher 就会收集进入dep,最后促发派发更新 触发watch-watcher得update方法

    get () {
        pushTarget(this)
        let value
        const vm = this.vm
        try {
          value = this.getter.call(vm, vm)
        } catch (e) {
          if (this.user) {
            handleError(e, vm, `getter for watcher "${this.expression}"`)
          } else {
            throw e
          }
        } finally {
          // "touch" every property so they are all tracked as
          // dependencies for deep watching
          if (this.deep) {
            traverse(value)
          }
          popTarget()
          this.cleanupDeps()
        }
        return value
      }
    

    4。调用queueWatcher(),这里源码中可以去看下这个对应的方法中会执行flushSchedulerQueue(),最后执行watcher得run 方法

    update () {
        /* istanbul ignore else */
        if (this.lazy) {
          this.dirty = true
        } else if (this.sync) {
          this.run()
        } else {
          queueWatcher(this)
        }
      }
    

    *5.run(),最后又返回到了this.cb.call,watch得执行回调中去了,上面我们说了在new watcher得时候cb 就是,watch得执行逻辑,

    run () {
        if (this.active) {
          const value = this.get()
          if (
            value !== this.value ||
            // Deep watchers and watchers on Object/Arrays should fire even
            // when the value is the same, because the value may
            // have mutated.
            isObject(value) ||
            this.deep
          ) {
            // set new value
            const oldValue = this.value
            this.value = value
            if (this.user) {
              try {
                this.cb.call(this.vm, value, oldValue)
              } catch (e) {
                handleError(e, this.vm, `callback for watcher "${this.expression}"`)
              }
            } else {
              this.cb.call(this.vm, value, oldValue)
            }
          }
        }
      }
    

    总结:

    1. vue在初始化watch得时候都会将watch当作一个对象循环处理,并且兼容它得几种写法
    2. 它实现得核心就是 w a t c h 这 个 方 法 , 它 会 实 例 化 一 个 w a t c h − w a t c h e r , watch这个方法,它会实例化一个watch-watcher, watchwatchwatcherwatch返回是一个函数清楚监听,是为了在代码中直接写this.$watch 不会触发这些执行逻辑。
    3. watch-watcher中得处理,parsePath会先处理字符串,getter返回得是一个函数。
    4. 执行watcher.get方法,替换全局watcher,执行getter完成依赖收集。
    5. 当监听得数据变化时,也会触发它得watch-watcher,来调用update方法,其实最后执行得是它得run方法,里面会执行watcher得对应数据得执行逻辑
    展开全文
  • vue 有8个声明周期,如果在vue实例创建之前需要获取页面初始数据。此时要进行ajax请求,应该是同步还是异步好?beforeCreate:function(){// getInitData ajax请求获取数据}我想着应该异步,那么如果异步请求,页面会...

    vue 有8个声明周期,如果在vue实例创建之前需要获取页面初始数据。

    此时要进行ajax请求,应该是同步还是异步好?

    beforeCreate:function(){

    // getInitData ajax请求获取数据

    }

    我想着应该异步,那么如果异步请求,页面会在还没有返回数据的时候进行渲染。

    此时可以使用loading动画遮盖。

    但是返回的数据该如何写入到已有的数据中?

    比如:

    替换了整个对象,会不会对数据渲染造成影响?

    vm 还没有实例化,能不能在vm实例化之前访问vm

    function getInitData(){

    // ... 这里获取上数据

    var data = getedData;

    vm.$data.initData = data;

    // 1. 这样替换了整个对象,会不会对数据渲染造成影响?

    // 2. vm 还没有实例化,能不能在此处访问?

    }

    var vm = new Vue({

    el:'#app',

    data:{

    initData:{

    name:'name',

    age:'age',

    bulabual:'bulaubla',

    }

    },

    beforeCreate:function(){

    getInitData()

    }

    })

    在浏览器console中替换对象测试,好像没有影响

    经浏览器测试,在vm未实例化之前访问无法访问其vm.$data

    那么上面的代码无法正确执行,鉴于此只好将初始化的ajax请求放入到beforeCreate中。

    如果使用异步请求,还是需要loading动画遮盖无数据的界面。

    那么如果使用同步请求,未请求完成时页面无法进行渲染,依然需要laoding动画遮盖。

    综上

    需要页面初始化获取数据的必须需要loading动画。

    异步初始化情况下可以同时渲染vue实例,在获取数据后再修改数据。

    而同步初始化情况下,是在数据获取之后再渲染vue实例。

    两者各有取舍。

    展开全文
  • 在实际开发中,遇到了在初始化页面的时候,在network中,请求被调用了两次 本来以为是created里面出了问题,却没有注意watch中的一个小细节,在watch中写了一个 immediate设为true,则监听的这个对象会立即输出,也...
  • 最近想用vue做一个小东西,谁知道一开始就遇到了一个棘手的问题:首先我想在页面加载前通过ajax请求页面展示所需要的信息,于是我在created钩子函数里面请求了我想要的数据created:function(){var url="/indexitem";...
  • 首先我们会想着在mounted或者created里面加入想要执行方法,但是有的时候会遇到在你执行这个方法的时候,页面还并没有被渲染完成...2.直接在本页面监视一个参数,发现参数被初始化了,说明页面也已经加载完成,因...
  • 编程之家收集整理的这篇文章主要介绍了vuejs实现ready函数加载之后执行某个函数的方法,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。vue.js 教程Vue.js(读音 /vjuː/,类似于 view) 是一套构建...
  • vue项目初始化

    2021-01-17 17:37:25
    项目初始化 使用 Vue CLI 创建项目 -Vant 组件库的导入方式 制作使用字体图标的方式 如何在 Vue 项目中处理 REM 适配 -axios 请求模块的封装 1.1 使用 Vue CLI 创建项目 如果你还没有安装 VueCLI,请执行下面的...
  • Vue.js DOM加载后执行自定义事件的方法发布于 2020-7-12|复制链接分享一篇关于VUE DOM加载后执行自定义事件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小妖过来看看吧最近想用vue做一个小东西,谁...
  • 场景:在.vue文件的props中的某值用watch监听了,因为做了监听,所以没有在比如created、mounted等生命周期对此值做操作,但是实际上在初始化此页面时,监听没有生效。 之后我加了immediate:true, 页面 初始化时就...
  • 执行完成后,发现系统在“c:/users/用户名”目录下面,创建了一个.npmrc文件,里面加上了如下一句: chromedriver_cdnurl=https://npm.taobao.org/mirrors/chromedriver 然后再执行vue init webpack projectna
  • 了解Vue的生命周期和渲染原理,有助于我们深层次的理解钩子函数的作用和调用场景,同时理解当数据发生变化之后,Vue内部做了哪些事情来响应。如果有误,请及时评论,方便完善。码字不易,请尊重版权。本片文章是基于...
  • Vue.nextTick( [callback, context] )方法在页面元素加载完成之后,执行里面的方法 this.$nextTick(()=>{ //元素加载完成后执行的代码 });
  • Vue组件加载完成后对应的钩子?

    千次阅读 2020-12-31 13:12:30
    vue组件中,使用了如下一个组件:<complain-list :list="complainData"></complain-list>模板如下:<template id="complain-list"><div class="collapse-card" v-for="data in dataList">...
  • Vue初始化

    千次阅读 2021-01-17 18:10:16
    Vue上面的函数怎么来的vue的打包路径在web中使用的vue打包路径: npm run build 打包生成vue.js下面是依次引入:src/platforms/web/entry-runtime-with-compiler.jssrc/platforms/web/runtime/index.jssrc/core/index....
  • 1)、在传统的vue项目开发中,基本上都是将组件、模板、以及css样式和html标签都写在一个html页面中,一个功能开发完成后,html的代码很庞大、臃肿,代码不易区分、不美观。2)、如果body标签中的有包含html标签还有...
  • 以往原生JavaScript或者JQuery的使用中有既定的初始化操作,现在用到了vue,特此纪要! 问题: 1. vue初始化操作如何处理? 2. vue中methods computed mounted created区别? 解决: created() 在DOM渲染前调用...
  • 1,首先我们看下官网对created和mounted这个2个生命周期怎么定义的:created:(在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。...
  • 当界面刷新的时候,state会变成初始值...也就是当这个异步执行完这个值赋值成功才去调用执行方法。 computed: { ...mapState({ automlType: function (state) { return state.automlType; } }) }, watch:
  • 在引入的Vue的时候,定义了Vue的构造函数,以及初始化Vue的实例方法和静态方法,总结了有以下一些比较重要的方法初始化实例方法,主要在src\core\instance\index.js文件里 _init方法Vue实例初始化方法) ...
  • this.mounted=function(){ this....页面的渲染过程无需等到 mount 中的方法执行完成后才能进行 那为什么会造成这种情况呢?经过排查,发现是在 getAllVirtualResourceList 函数的 ajax 请求中,用到了
  • 我犯的错误:作为vue小白,并不知道还要单独去创建初始vue项目,于是自己在webstrom中建了一个Empty Project,在其中新增了一个js文件,就开始import Vue from “vue”了。运行自然就报错了:SyntaxError: ...
  • 2.1前端项目初始化步骤 安装 Vue 脚手架 通过 Vue 脚手架创建项目 配置 Vue 路由 配置 Element-UI 组件库 配置 axios 库 初始化 git 远程仓库 (前端项目必须使用远程仓库代码管理) 将本地项目托管到GitHhub...
  • Vue初始渲染的过渡

    2021-07-09 17:19:42
    初始渲染就是在页面刚出现或者刷新的时候实现一些过渡效果,而且默认状态肯定不能是隐藏的,否则无法使用初始渲染。 若要使用初始渲染,必须给transition添加 appear attribute或者v-on:appear 钩子 <...
  • 一、Vue-cli安装vue-cli是vue官方提供的脚手架工具,默认搭建好了一个项目的基本架子,我们在其基础上进行相应修改即可。全局安装:npm install -g @vue/cli查看是否安装成功:二、命令行方式1、创建项目npm create ...
  • vue里swiper的一些坑

    2021-01-13 09:58:18
    实例: 错误(无法显示出分页器按钮,此功能不适用与for循环出来的图片,只有当该页面图片固定几张时能正常用)第一步: 安装 npm i swiper (vue插件自带)第二步: 在当前页面里引入import swiper from 'swiper';...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,469
精华内容 14,587
关键字:

vue初始化完成后执行方法

vue 订阅