精华内容
下载资源
问答
  • Vue foreach

    千次阅读 2019-12-09 14:16:27
    let codeKeyArr = []; this.displayTypeOptions.forEach((option) => { // if (this.detail.displayType & option.codeKey) { codeKeyArr.push(option.id); });
      let codeKeyArr = [];
            this.displayTypeOptions.forEach((option) => {
              // if (this.detail.displayType & option.codeKey) {
              codeKeyArr.push(option.id);
            });
    
     formatDisplayType() {
            //显示类型
            let codeKeyArr = [];
            this.displayTypeOptions.forEach((option) => {
              // if (this.detail.displayType & option.codeKey) {
              codeKeyArr.push(option.id);
            });
            console.log("-----", codeKeyArr);
            this.displayTypeList = codeKeyArr;
          }`在这里插入代码片`
    
    展开全文
  • 3.1. 条件渲染有时候我们要根据数据的情况,决定标签是否进行显示...Vue帮我们提供了一个v-if的指令,帮助我们完成判断的模板处理。<div id="app"> <h1 v-if="ok">Yesh1> <h1 v-else>Noh1>...

    6d586a2c35cf3cf832c12b227a751bc4.png

    3.1. 条件渲染

    有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作。最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据。如果有数据就显示表格数据。Vue帮我们提供了一个v-if的指令,帮助我们完成判断的模板处理。

    <div id="app">  <h1 v-if="ok">Yesh1>  <h1 v-else>Noh1>  div><script>  var app = new Vue({             el: '#app',                   data: {          ok: true      // true,返回:Yes,   false=> No                   }  });script>

    v-if指令可以根据数据绑定的情况进行插入标签或者移除标签。当然,如果熟悉js的都清楚,有if,肯定会有else。Vue提供的是 v-else指令。

    3.2. 列表渲染

    3.2.1. 基本v-for循环渲染标签

    模板引擎都会提供循环的支持。Vue也不例外,Vue是提供了一个v-for指令。基本的用法类似于foreach的用法。还是看例子最直接,上代码:

    <div id="app">  <table>    <thead>      <tr>        <th>姓名th>        <th>年龄th>        <th>地址th>      tr>    thead>    <tbody>             <tr v-for="item in UserList" >        <td>{{ item.name }}td>        <td>{{ item.age }}td>        <td>{{ item.address }}td>      tr>    tbody>  table>div><script>  var app = new Vue({             el: '#app',                   data: {                        UserList: [      {'name': 'malun', 'age': 18, 'address': '北京黑地下室'},      {'name': 'flydragon', 'age': 22, 'address': '厦门的很多热的地方'},      {'name': 'temp', 'age': 25, 'address': '东北松花江上'}     ]    }  });script>

    3.2.2. Template循环渲染多标签

    上面的例子,我们演示的是 每次循环输出一个tr标签。如果我们希望每次循环生成两个tr标签呢?如果还有生成其他的标签呢?Vue给我们提供了template标签,供我们用于v-for循环中进行处理。上代码喽:

    <ul>    <template v-for="item in items">    <li>{{ item.msg }}li>    <li class="divider">li>  template>ul>

    3.2.3. 关于v-for对应的数组的更新

    由于Vue的机制就是检测数据的变化,自动跟新HTML。数组的变化,Vue之检测部分函数,检测的函数执行时才会触发视图更新。这些方法如下:

    • push()

    • pop()

    • shift()

    • unshift()

    • splice()

    • sort()

    • reverse()

    3.3. 表格显示的综合案例

    下面是一个综合的案例,每秒钟往表格中添加一条数据。本案例综合使用了v-if 和 v-for循环综合案例。

     <html lang="en"><head>  <meta charset="UTF-8">  <title>Vue入门之动态显示表格title>  <script src="https://unpkg.com/vue/dist/vue.js">script>head><body>  <div id="app">    <table>      <thead>        <tr>          <th>姓名th>          <th>年龄th>          <th>地址th>        tr>      thead>            <tbody v-if="UserList.length > 0">         <tr v-for="item in UserList" >          <td>{{ item.name }}td>          <td>{{ item.age }}td>          <td>{{ item.address }}td>        tr>      tbody>      <tbody v-else>        <tr><td colspan="3">没有数据奥!td>tr>      tbody>    table>  div>  <script>    var app = new Vue({               el: '#app',                     data: {                          UserList: []      }    });    // 每秒钟插入一条数据。    setInterval(function () {      app.UserList.push({'name': 'malun', 'age': 18, 'address': '北京黑地下室'});    }, 1000);script>body>html>

    3.4. 总结列表和条件绑定

    列表的使用其实本质还是js的衍生使用,对于有js开发基础的没有什么难度。关键是多写几个案例就会详细通了。

    fdde94dc80267421fe0762b8e3d47b27.gif

    60d7c488eeae001a2ce2ae96afecb5c5.png

    展开全文
  • Vue 3 的 Template 支持多个根标签,Vue 2 不支持Vue 3 有 createApp(),而 Vue 2 的是 new Vue()createApp(组件),new Vue({template, render})v-model代替以前的v-model和.syncvue3中v-model的用法要求:3.1....
    1. Vue 3 的 Template 支持多个根标签,Vue 2 不支持
    2. Vue 3 有 createApp(),而 Vue 2 的是 new Vue()
      createApp(组件),new Vue({template, render})
    3. v-model代替以前的v-model和.sync
      vue3中v-model的用法
    要求:
    3.1. props属性名任意,假设为x
    3.2. 事件名必须为"update:x"
    效果:
    <Switch :value="y" @update:value="y=$event"/>
    vue2中的写法
    <Switch :value.sync="y"/>
    vue3中的写法
    <Switch v-model:value="y"/>
    

    4. context.emit

    新增context.emit,与this.$emit(vue3中只能在methods里使用)作用相同

      • context.emit用法
    import {SetupContext } from 'vue'
    setup(props: Prop, context: SetupContext) {
        const toggle = () => {
          context.emit('input', !props.value)
        }
        return {toggle}
    }
    

    5. Vue3中的属性绑定

    默认所有属性都绑定到根元素
    使用inheritAttrs: false可以取消默认绑定
    使用attrs或者context.attrs获取所有属性
    使用v-bing="$attrs"批量绑定属性
    使用 const {size, level, ...rest} = context.attrs 将属性分开

    5.1 使用场景
    在vue2中我们在父组件绑定click事件,子组件必须内部触发click,而vue3中在父组件绑定子组件的根元素上也会跟着绑定

    • ButtonDemo.vue
    <div>
        <Button @click="onClick" @focus="onClick" size="small">你好</Button>
      </div>
    setup() {
          const onClick = () => {
            console.log("aaa")
          }
          return {onClick}
        },
    
    • Button.vue
    <template>
      <div>
        <button>
          <slot/>
        </button>
      </div>
    </template>
    

    上面的代码Button的click事件会在根元素div上绑定,如果我们要指定click的区域为button元素的话我们就需要使用inheritAttrs

    • Button.vue
    <template>
      <div>
        <button v-bind="$attrs">
          <slot/>
        </button>
      </div>
    </template>
    <script lang="ts">
      export default {
        inheritAttrs: false
      }
    </script>
    

    如果想要一部分属性绑定在button上一部分在div上就需要在setup里

    • Button.vue
    <template>
      <div :size="size">
        <button v-bind="rest">
          <slot/>
        </button>
      </div>
    </template>
    <script lang="ts">
      import {SetupContext} from 'vue'
      export default {
        inheritAttrs: false,
        setup(props: any, context:SetupContext ) {
          const {size, ...rest} = context.attrs
          return {size, rest}
        }
      }
    </script>
    

    5.2. props和context.attrs的区别

    • props要现在当前组件props属性里声明才能取值,attrs不用先声明

    f53b2c402062f983e5ab6d54ec922849.png

    99b733eeaf3d0fdbd19e3574629c3937.png

    第一张图里因为没有声明props所以是空对象,第二个声明了size,所以只得到了size

    • props不包含事件,attrs包含我们没有办法在props里声明click这一类的事件
    • props没有声明的属性,会跑到attrs里

    f571102fd940964b7b67ace35689dd89.png

    上图中我们在props里声明了size,所以attrs里就没有size了

    • 当我们在html标签中只写属性而不赋值的时候,props支持string以外的类型,attrs只有string类型

    629d15755158852430d783211c40e905.png

    40eb02b96845ae32490c8f9d8700394d.png
    上面第一张图里我们在html里只写属性不赋值的情况下其实disabled是Bolean类型的,但我们通过attrs却得到的是空字符串,而第二张我们通过props指定了diabled为Boolean值我们就可以通过props拿到我们需要的true

    6.slot具名插槽的使用

    vue2中的用法
    子组件

    <slot name="title">

    父组件

    <template slot="title">
      <h1>哈哈哈</h1>
    </template>
    vue3中子组件用法不变,父组件需要使用v-slot:插槽名

    父组件

    <template v-slot:title>
      <h1>哈哈哈</h1>
    </template>

    7. Teleport传送门组件

    <Teleport to="body">
      需要传送到body下面的内容
    </Teleport>

    8. vue3中动态挂载组件的方法

    通过引入h函数第一个参数是组件,第二个是元素的属性(第一个参数组件的props,也就是直接可以在使用组件的时候传入的属性),第三个是插槽的属性。
    其中我们在render里监听我们v-model绑定的update事件的时候,需要使用onUpdate:属性名

    import {createApp, h} from 'vue'
    import Dialog from './Dialog.vue'
    export const openDialog = (options: Options) => {
      const {title, content} = options
      const div = document.createElement('div')
      document.body.append(div)
      const app = createApp({
        render() {
          return h(Dialog, {
            visible: true, cancel: () => {},
            'onUpdate:visible': (newValue: boolean) => {
              if (newValue === false) {
                app.unmount(div)
              }
            }
            }, {title, content})
        }
      })
      app.mount(div)
    }
    

    9. 父组件里获取子组件内容,渲染子组件

    在父组件的setUp里通过context.slots.default()拿到子组件数组,然后通过component组件渲染
    比如:

    • TabsDemo.vue
    <Tabs>
        <Tab title="导航1">内容1</Tab>
        <Tab title="导航2">内容2</Tab>
    </Tabs>
    • Tabs.vue
    <template>
      <component v-for="(tab, index) in defaults" :key="index" :is="tab"></component>
    </template>
    <script lang="ts">
    import {SetupContext} from 'vue'
    export default {
      setup(props, context: SetupContext) {
        const defaults = context.slots.default()
        return {
          defaults
        }
      }
    }
    </script>
    

    vue3中所有的组件最后都会导出一个对象这个对象就是我们的子组件里的type(context.slots.default()[0].type),所以我们可以通过type判断子组件是不是我们要求的子组件,以Tabs组件为例我们需要用户使用的时候下面的子组件全部都是我们的Tab组件

    • Tabs.vue
    import Tab from './Tab.vue'
    export default {
      setup(props, context: SetupContext) {
        const defaults = context.slots.default()
        defaults.forEach(tag => {
          if (tag.type !== Tab) {
            throw new Error('Tabs 子标签必须是 Tab')
          }
        })
        return {
          defaults
        }
      }
    }
    

    10. vue3中ref的使用

    10.1.单个ref

    <script>
    import {
      onMounted,
      ref,
    } from 'vue';
    
    export default {
      setup() {
        const headline = ref(null);
    
        // Before the component is mounted, the value
        // of the ref is `null` which is the default
        // value we've specified above.
        onMounted(() => {
          // Logs: `Headline`
          console.log(headline.value.textContent);
        });
    
        return {
          // It is important to return the ref,
          // otherwise it won't work.
          headline,
        };
      },
    };
    </script>
    
    <template>
      <div>
        <h1 ref="headline">
          Headline
        </h1>
        <p>Lorem ipsum ...</p>
      </div>
    </template>
    

    10.2. v-for里的ref

    <template>
      // el当前元素,divs是存储每个元素的数组
      <div v-for="(item, index) in list" :ref="el => { divs[index] = el }">
        {{ item }}
      </div>
    </template>
    
    <script>
    import {
      onMounted,
      ref,
    } from 'vue';
    
    export default {
      setup() {
        const divs = ref([]);
    
        onMounted(() => {
          console.log(divs.value)
        });
    
        return {
          divs
        };
      },
    };
    </script>
    

    11. watchEffect用来代替生命周期里的onMounted和onUpdated


    初始化页面的时候watchEffect里的代码会执行,当watchEffect里的数据有更新的时候同样会执行

    const count = ref(0)
    
    watchEffect(() => console.log(count.value))
    // -> logs 0
    
    setTimeout(() => {
      count.value++
      // -> logs 1
    }, 100)
    

    注意watchEffect第一次运行是在组件挂载之前,如果需要访问DOM需要将我们的watchEffect放在onMounted里

    onMounted(() => {
      watchEffect(() => console.log(count.value))
    })
    
    展开全文
  • vue 源码探究(第二弹)接着上一篇,继续来讲一个非常有意思的东西documentFragment解析六、DocumentFragment: 文档碎片(高效批量更新多个节点)这里先甩出 2 个概念,什么是 document,以及什么是 ...

    vue 源码探究(第二弹)

    接着上一篇,继续来讲一个非常有意思的东西documentFragment

    解析

    六、DocumentFragment: 文档碎片(高效批量更新多个节点)

    这里先甩出 2 个概念,什么是 document,以及什么是 documentFragment

    • document: 对应显示的页面, 包含 n 个 element 一旦更新 document 内部的某个元素界面更新
    • documentFragment: 内存中保存 n 个 element 的容器对象(不与界面关联), 如果更新 framgnet 中的某个 element, 界面不变

    如果说,我们想要批量更新多个节点,可不可以这样理解,放入 documentFragment 中去,更新完了之后,再插入 document 中,因为 documentFragment 也是 document 下的一个节点。

    举一个简单的例子:

    <ul id="fragment_test">
        <li>test1</li>
        <li>test2</li>
        <li>test3</li>
      </ul>

    如果我们想把ul中li中的文本信息,全部由testx变成zhangjing123,原始的方式是不是这样做:

    1. 遍历
    2. 更改

    这样,是不是document刷新了3次,如果说有1万个li呢,document是不是要刷新1万次?
    明显这样很不好,那么文档碎片出场了。

    const ul = document.getElementById('fragment_test')
      // 1. 创建fragment
      const fragment = document.createDocumentFragment()
      // 2. 取出ul中所有子节点取出保存到fragment
    
      // 这里提一个小问题,如果这样的代码,会变成啥样?
      // let child
      // while(child=ul.firstChild) { 
      // }
      // 答案:死循环
      // 那为什么加了一行 fragment.appendChild(child) 就可以呢?
      // 因为一个节点只能有一个父亲
      // NOTICE:ul和li中的换行也是一个文本节点,所以我们使用
    //   firstChild用法
    //   此属性能够获取指定元素节点下的第一个子节点。
    //   如果元素下没有子节点,那么返回null。
    //   特别说明:
    //  (1).子节点并不一定都是元素节点,还有可能包含文本节点或者注释节点等节点。
    //  (2).空格或者换行被看做文本节点。
      let child
      while(child=ul.firstChild) { 
        // 一个节点只能有一个父亲
        fragment.appendChild(child)  
        // 先将child从ul中移除, 添加为fragment子节点
      }
    
      // 3. 更新fragment中所有li的文本
      Array.prototype.slice.call(fragment.childNodes).forEach(node => {
        if (node.nodeType===1) { // 元素节点 <li>
          node.textContent = 'zhangjing123'
        }
      })
    
      // 4. 将fragment插入ul
      ul.appendChild(fragment)
    

    未完待续...
    接下来,还有一个更有趣的东西

    下一章继续~

    展开全文
  • 这三个小技巧应该熟知:组件 : 全局组件注册Vue权限控制 : 高精度全局权限控制Render函数 : 拯救繁乱的template路由分区以及动态添加路由「全局组件注册」...引入vue // 处理首字母大写 abc => Abc function c...
  • 响应式的进化本项目涉及代码:https://github.com/dangjingtao/vue3_reactivity_simple推荐阅读:observer-util:https://github.com/nx-js/observer-util1.defineProperty的缺点和vue 2的hack 方案1.1 新属性设置不...
  • (给最牛B的前端框架-Vue加星标,持续稳定提升前端核心技能)本文会从以下三个方面,来进阶我们对vue的运用能力:组件 :全局组件注册Render函数 :拯救繁乱的templateVue权限控制:高精度全局权限控制全 局 组 件 注 册...
  • 源码地址:传送门vue-router是开发vue项目中必不可少的依赖,为了能更好的理解其实现原理,而源码阅读起来又过于复杂和枯燥,笔者这里实现一个简易版本的vue-rouer,帮助自己来更好的理解源码。其功能如下:通过Vue...
  • Vue IE下的forEach

    2020-02-15 14:31:44
    用https://www.caniuse.com/这个网站看,ie是不支持forEach语法的,但是vue貌似对forEach进行了包装还是怎么的,反正ie11是支持的。但是我的代码仍然光荣牺牲在了IE下: let popupEle = popup.$children[0].$...
  • vueforEach循环的使用

    万次阅读 2020-03-22 12:31:27
    //data为集合 data.forEach(function(item, index) { //item 就是当日按循环到的对象 //index是循环的索引,从0开始 })
  • <code>//在vue中定义数组对像list data:{ list:[ {inpuoff:true,msg:"切割图片"}, {inpuoff:false,msg:"编写页面代码"}, {inpuoff:false,msg:"编写JS代码"} ]} //定义方法 methods:{...
  • VueforEach和push

    2020-09-03 15:11:42
    tagTacticsFilter(tacticsTag) { let data = [] let _tacticsTagList = this.tacticsTagList let attrList = tacticsTag.split(',') attrList.forEach(function(item) {//循环 _tacticsTagList.forEach(functi
  • 留言就行 二、map方法主要是创建新的数组,对数组每一个进行函数的结果进行组建新的数组返回 三、jq中的forEach对数组进行循环调用 forEach只用时会出现一个问题就是不能在其中截断整个步骤,比如你在进行循环时拿到...
  • 随着各大前端框架的诞生和演变,SPA开始流行,单页面应用的优势在于可以不重新加载...好在Vue2.0后是支持服务端渲染的,零零散散花费了两三周事件,通过改造现有项目,基本完成了在现有项目中实践了Vue服务端渲染...
  • var arr = [1,2,3,4,5,] ...arr.forEach( async (item)=>{ await this.test(item) }) async test(item){ var res = await self.axios.post("https://www.baidu.com/",{id:item.id}) console.log(res) }
  • 聊下Vue.js开发项目的最佳实践以及风格规范,为列表渲染设置属性Keykey这个特殊属性主要用在Vue.js的虚拟DOM算法中,在对比新旧虚拟节点时辨识虚拟节点。在v-if/v-if-else/v-else 中使用key如果一组v-if+v-else的...
  • 如何让自己与刚学vue的人拉开差距呢? 其实,很多人对于vue只停留在基础使用。想要提升自己,就应该想办法将其运用到更高的层次。本文会从以下三个方面,来进阶我们对vue的运用能力组件 : 全局组...
  • 在前端开发中,经常会遇到一些通过遍历循环来获取想要的内容的情形,而且这种情形在开发中无所不在,那么本篇博文就来分享一个比较常用又经典的知识点:forEach() 的使用。 forEach() 是前端开发中操作数组的一种...
  • vue 遍历对象foreach for in

    千次阅读 2020-01-03 18:36:05
    对象结构: info = {name: "xiaoming", age: 10, grade: ...foreach: Object.keys(info).foreach((value, key) => { console.log(value) }) for in: for (let i in info) { console.log(info[i]) ...
  • Vue.js模板语法vue.js使用了基于HTML的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据,其核心就是一个允许开发者采用简洁的模板语法来将数据渲染进DOM系统。使用各种组件来做成一个项目的话,需要...
  • Map遍历原数组,生成新数组。 var arr = testWorkItemForm.testWorkItemList.map(el=>...var arr = testWorkItemForm.testWorkItemList.forEach(el=>{ this.$set(item,'select',false); // th
  • VUE基础知识1:数组forEach

    万次阅读 2019-01-19 03:40:46
    vue是数据驱动,vue主要操作的是数据 1、JS中有哪些数据类型 (1)基本数据类型:number,string,boolean,null,undefined (2)引用数据类型: Object, function, Symbol(ES6)   2、{} 和 [] 操作数组的方法有...
  • 今天小编就为大家分享一篇vue forEach循环数组拿到自己想要的数据方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • vue 使用forEach报错,this指向问题

    千次阅读 2019-04-15 10:26:23
    getCrumbs(){ let crumbs = JSON.parse(localStorage.getItem( "crumbs" ));... //[Vue warn]: Error in created hook: "TypeError: Cannot set property 'manageClass' of undefined" 报错 crumbs.forEach...
  • 作者简介小北9年前端开发工作经验,前端leade,主要分享:前端方面技术文章csdn:CSDN-个人空间vue的双向数据绑定,众所周知是基于Object.defineProperty这个在浏览器的特性api来实现的。但是怎么从视图到数据,数据...
  • 前端开发:VueforEach() 的使用

    千次阅读 2020-12-11 09:57:50
    在前端开发中,经常会遇到一些通过遍历循环来获取想要的内容的情形,而且这种情形在开发中无所不在,那么本篇博文就来分享一个比较常用又...在Vue项目中,标签里的循环使用v-for,方法里面的循环使用forEach。 1、f
  • vue.runtime.esm.js:1888 TypeError: Cannot read property 'forEach' of undefined at VueComponent.<anonymous> (crud.js:957) at invokeWithErrorHandling (vue.runtime.esm.js:1854) at VueComponent....
  • vue 过滤器的使用(解决forEach遇到的问题)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,124
精华内容 449
关键字:

foreachvue

vue 订阅