对 keep-alive 的理解,使用场景以及存在的问题

226 篇文章 7 订阅
订阅专栏
81 篇文章 6 订阅
订阅专栏
62 篇文章 6 订阅
订阅专栏

结论先行:

<keep-alive>是 Vue 的内置组件,主要是用于缓存组件的实例,避免组件重复的被创建和销毁组件,提高应用的响应速度和性能。

原理:keep-alive 是一个缓存,会标记这个虚拟节点被缓存过了,后续就不会重新初始化,也不会进行销毁。 

那常见的配置属性有 include 、exclude 和 max; 

include 和 exclude 用于指定需要缓存或排除的组件名称;

而 max 是用来定义组件的最大缓存个数。

内部采用 LRU 算法用于维护缓存列表。如果缓存个数超过最大数,那么会将最久没有被访问到的组件移出缓存列表,也就是销毁组件。

keep-alive 提供了两个钩子函数: activated 钩子和 deactivated 钩子。

activated:当组件被激活(使用)的时候触发,常用于执行一些数据初始化或者异步操作;

deactivated:当组件失活(不被使用)的时候触发;

但是在使用 keep-alive 时,要注意数据的更新问题,避免出现数据无法更新的情况。

 

一、背景

在平常开发中,有部分组件没有必要多次初始化。这时,我们需要将组件进行持久化,使组件的状态维持不变。在下一次展示时,也不会进行重新初始化组件。keep-alive就有这个功能。

二、含义

<keep-alive>是 Vue 的内置组件可以使被包裹的组件保留状态,避免重复的创建和销毁组件,提高应用的响应速度和性能。

当一个组件被<keep-alive>标签包裹时,会缓存组件的实例在内存中,而不会把组件销毁。当这个组件再次被使用时,Vue会从缓存中提取组件的实例,将其重新挂载到页面上。

这个功能可以提高应用的性能,特别是在需要频繁切换组件的场景下,就比如Tab切换或者路由切换,因为不需要每一次切换时都重新创建和销毁组件,而是直接从缓存中获取,这样可以避免重复的初始化和渲染,从而提高应用的响应速度和性能。

举个应用场景:

有个员工列表,现在我们点击某条数据,查看员工详情后,再返回到员工列表。这个时候我们就希望这个列表能够保持刚才的状态,这时候就可以使用keep-alive把这个列表所在的组件包裹。

和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。 

三、配置属性

include 和 exclude用于指定需要缓存或排除的组件名称;

max 和 min 用于指定缓存的最大和最小数量。 

① include:包含

值为字符串 / 正则表达式 / 数组。只有组件的名称(name)与 include 的值相同的才会被缓存。即指定哪些被缓存,可以指定多个被缓存。

这里以字符串为例,指定多个组件缓存,语法是用逗号隔开。如下: 

// 指定 home 组件和 about 组件被缓存
<keep-alive include="home,about">
    <router-view></router-view>
</keep-alive>

 ② exclude:排除,优先级大于 include

同上,指定哪些组件不被缓存。

// 除了home组件和about组件,别的都缓存
<keep-alive exclude="home,about">
    <router-view></router-view>
</keep-alive>

使用 include 和 exclude 属性时,缓存组件的名称 name 一定要赋值,否则无法识别到对应的路由组件。 

如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值),匿名组件不能被匹配。

当使用正则或者是数组时,要记得使用v-bind 。 

<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
  <component :is="view"></component>
</keep-alive>
 
<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>
 
<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
  <component :is="view"></component>
</keep-alive>
 

③ max:定义组件的最大缓存个数。

内部采用LRU算法用于维护缓存列表。如果缓存个数超过最大数,那么会将最久没有被访问到的组件移出缓存列表,也就是销毁组件。

四、使用 keep-alive 的钩子函数执行顺序问题

keep-alive 提供了两个钩子函数: activated 钩子和 deactivated 钩子。

activated:当组件被激活(使用)的时候触发,即进入这个页面的时候触发,常用于执行一些数据初始化或者异步操作;

deactivated:当组件失活(不被使用)的时候触发,即离开这个页面的时候触发;

① 首次进出组件时:

beforeRouteEnter > beforeCreate > created > mounted > activated > ... ... > beforeRouteLeave > deactivated

② 再次进出组件时:

beforeRouteEnter > activated > ... ... > beforeRouteLeave > deactivated

③ 结论 

初始进入和离开 created ---> mounted ---> activated --> deactivated
后续进入和离开 activated --> deactivated

五、应用场景

① 缓存动态组件

 ② 缓存路由

Vue2写法: 

Vue3写法:

在缓存路由的时候,需要借助 v-slot 插槽 + 动态组件的方式,实现路由的缓存。

也可以通过meta属性指定哪些页面需要缓存

③ 实际场景 

1)查看表格某条数据的详情页,返回还是之前的状态。比如还是之前的筛选结果,还是之前的页数等;

2)填写的表单的内容路由跳转返回还在。比如 input框、下选择拉框、开关切换等用户输入了一大把东西,跳转再回来不能清空啊,不用让用户再写一遍。

六、原理

keep-alive 是一个缓存,会标记这个虚拟节点被缓存过了。后续就不会重新初始化,也不会进行销毁。 

keep-alive是Vue中内置的一个组件,源码位置:src/core/components/keep-alive.js

 

解析: 

abstract:true,标记这个组件没有任何含义,不需要记录父子关系中。

export default {
  name: 'keep-alive',
  abstract: true,

  props: {
    include: [String, RegExp, Array],
    exclude: [String, RegExp, Array],
    max: [String, Number]
  },

  created () {
    this.cache = Object.create(null)
    this.keys = []
  },

  destroyed () {
    for (const key in this.cache) {
      pruneCacheEntry(this.cache, key, this.keys)
    }
  },

  mounted () {
    this.$watch('include', val => {
      pruneCache(this, name => matches(val, name))
    })
    this.$watch('exclude', val => {
      pruneCache(this, name => !matches(val, name))
    })
  },

  render() {
    /* 获取默认插槽中的第一个组件节点 */
    const slot = this.$slots.default
    const vnode = getFirstComponentChild(slot)
    /* 获取该组件节点的componentOptions */
    const componentOptions = vnode && vnode.componentOptions

    if (componentOptions) {
      /* 获取该组件节点的名称,优先获取组件的name字段,如果name不存在则获取组件的tag */
      const name = getComponentName(componentOptions)

      const { include, exclude } = this
      /* 如果name不在inlcude中或者存在于exlude中则表示不缓存,直接返回vnode */
      if (
        (include && (!name || !matches(include, name))) ||
        // excluded
        (exclude && name && matches(exclude, name))
      ) {
        return vnode
      }

      const { cache, keys } = this
      /* 获取组件的key值 */
      const key = vnode.key == null
        // same constructor may get registered as different local components
        // so cid alone is not enough (#3269)
        ? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
        : vnode.key
     /*  拿到key值后去this.cache对象中去寻找是否有该值,如果有则表示该组件有缓存,即命中缓存 */
      if (cache[key]) {
        vnode.componentInstance = cache[key].componentInstance
        // make current key freshest
        remove(keys, key)
        keys.push(key)
      }
        /* 如果没有命中缓存,则将其设置进缓存 */
        else {
        cache[key] = vnode
        keys.push(key)
        // prune oldest entry
        /* 如果配置了max并且缓存的长度超过了this.max,则从缓存中删除第一个 */
        if (this.max && keys.length > parseInt(this.max)) {
          pruneCacheEntry(cache, keys[0], keys, this._vnode)
        }
      }

      vnode.data.keepAlive = true
    }
    return vnode || (slot && slot[0])
  }
}

可以看到该组件没有template,而是用了render,在组件渲染的时候会自动执行render函数

this.cache是一个对象,用来存储需要缓存的组件,它将以如下形式存储:

this.cache = {
    'key1':'组件1',
    'key2':'组件2',
    // ...
}

在组件销毁的时候执行pruneCacheEntry函数:

function pruneCacheEntry (
  cache: VNodeCache,
  key: string,
  keys: Array<string>,
  current?: VNode
) {
  const cached = cache[key]
  /* 判断当前没有处于被渲染状态的组件,将其销毁*/
  if (cached && (!current || cached.tag !== current.tag)) {
    cached.componentInstance.$destroy()
  }
  cache[key] = null
  remove(keys, key)
}

mounted钩子函数中观测 include 和 exclude 的变化,如下: 

mounted () {
    this.$watch('include', val => {
        pruneCache(this, name => matches(val, name))
    })
    this.$watch('exclude', val => {
        pruneCache(this, name => !matches(val, name))
    })
}

如果include 或exclude 发生了变化,即表示定义需要缓存的组件的规则或者不需要缓存的组件的规则发生了变化,那么就执行pruneCache函数,函数如下:

function pruneCache (keepAliveInstance, filter) {
  const { cache, keys, _vnode } = keepAliveInstance
  for (const key in cache) {
    const cachedNode = cache[key]
    if (cachedNode) {
      const name = getComponentName(cachedNode.componentOptions)
      if (name && !filter(name)) {
        pruneCacheEntry(cache, key, keys, _vnode)
      }
    }
  }
}

在该函数内对this.cache对象进行遍历,取出每一项的name值,用其与新的缓存规则进行匹配,如果匹配不上,则表示在新的缓存规则下该组件已经不需要被缓存,则调用pruneCacheEntry函数将其从this.cache对象剔除即可。

关于keep-alive的最强大缓存功能是在render函数中实现,首先获取组件的key值:

const key = vnode.key == null? 
componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
: vnode.key

拿到key值后去this.cache对象中去寻找是否有该值,如果有则表示该组件有缓存,即命中缓存,如下:

/* 如果命中缓存,则直接从缓存中拿 vnode 的组件实例 */
if (cache[key]) {
    vnode.componentInstance = cache[key].componentInstance
    /* 调整该组件key的顺序,将其从原来的地方删掉并重新放在最后一个 */
    remove(keys, key)
    keys.push(key)
} 

 直接从缓存中拿 vnode 的组件实例,此时重新调整该组件key的顺序,将其从原来的地方删掉并重新放在this.keys中最后一个。

this.cache对象中没有该key值的情况,如下:

/* 如果没有命中缓存,则将其设置进缓存 */
else {
    cache[key] = vnode
    keys.push(key)
    /* 如果配置了max并且缓存的长度超过了this.max,则从缓存中删除第一个 */
    if (this.max && keys.length > parseInt(this.max)) {
        pruneCacheEntry(cache, keys[0], keys, this._vnode)
    }
}

表明该组件还没有被缓存过,则以该组件的key为键,组件vnode为值,将其存入this.cache中,并且把key存入this.keys中。

此时再判断this.keys中缓存组件的数量是否超过了设置的最大缓存数量值this.max,如果超过了,则把第一个缓存组件删掉。

七、keep-alive存在的问题:缓存后如何获取数据

存在的问题:数据更新问题,缓存的组件重新进入不会再触发created生命周期中的方法,因此数据不会更新。

解决办法: 

① 在 beforeRouteEnter 钩子函数中,在路由进入之前先获取数据:

每次组件渲染或者每次进入路由的时候,都会执行 beforeRouteEnter 。

beforeRouteEnter(to, from, next){
    next(vm=>{
        console.log(vm)
        // 每次进入路由执行
        vm.getData()  // 获取数据
    })
},

 ② 在 activated 生命周期中,获取数据:

在 keep-alive 缓存的组件被激活的时候,都会执行 actived 钩子。

activated() {
    this.getData() // 获取数据
},

注意:服务器端渲染期间 activated 不被调用。

八、总结

总的来说,使用 keep-alive可以有效地提高应用的响应速度和性能,特别是在需要频繁切换组件的情况下。但是在使用 keep-alive 时,要注意数据的更新问题,避免出现数据无法更新的情况。

keep-alive 是一个缓存,会标记这个虚拟节点被缓存过了,后续就不会重新初始化,也不会进行销毁。 

vue中keep-alive组件的入门使用教程
12-10
Vue.js中的`<keep-alive>`组件是一种非常实用的功能,用于在组件切换过程中保持组件的状态,避免每次切换都重新创建和销毁组件...在处理复杂的应用场景时,理解并正确使用`<keep-alive>`组件及其生命周期钩子至关重要。
vue 中的 keep-alive
weixin_39111384的博客
12-28 5390
一、什么是 Keep-alive keep-alive 是 vue 中的内置组件,能够在组件切换过程中将状态保留在内存中,防止重复的渲染 DOM; keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们; keep-alive 可以设置一下 props 属性: include - 字符串或者是正则表达式。只有名称匹配的组件才能被缓存 exclude - 字符串或者是正则表达式。 max - 数字。最多可以缓存多少组件实例。 关于 keep-alive 的基本用法 <keep-
Vue中keep-alive缓存的详解(深度理解
常来常往,共同成长
01-15 4502
keep-alive是vue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM,keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们
Vue实战指南:Keep-Alive组件的作用、使用步骤、适用场景及示例代码
最新发布
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!
09-13 1331
标签内时,该组件在切换出去之后不会被销毁,而是会被保留在内存中,保留其状态和绑定的数据。当再次激活这个组件时,可以快速恢复之前的状态,避免了重新渲染的过程,从而提升了用户的体验。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,是Vue的一个内置组件,它主要用于缓存不活动的组件。,当用户在两个组件之间切换时,组件实例将被保留下来。在这个示例中,我们有两个简单的组件。
动态组件、keep-alive使用及自定义指令
qq_57423665的博客
04-24 636
1.什么是自定义指令vue 官方提供了v-text、v-for、 v-model、 v-if 等常用的指令。除此之外 vue 还允许开发者自定义指令。2. 自定义指令的分类。
keep-alive 使用场景和原理
youhebuke225的博客
05-28 415
通过以上原理和使用场景的介绍,我们可以更好地理解和应用 Vue 的 keep-alive 组件来优化应用的性能和用户体验。
关于HTTP中的keep-alive
weixin_44374938的博客
06-03 1万+
1.HTTP中的keep-alive 既然上面提到了HTTP是基于请求与响应的,且最主要的两个特点就是无连接和无状态,但需要说明的是,虽然是无连接的,但其底层也就是传输层大多却是基于 TCP面向连接的通信方式,因此,这里的无连接指的是:当server端和client端进行通讯的时候,client端向server端发起请 求,server端接收请求之后返回给client端一个响应,之后就会断开不再继续保持连接了;这样有一个好处就是对于只有一次访问的连接来说不仅节省 资源还很高效,但很明显,如果client端还
keep-alive使用及详解
热门推荐
一夜枫林
07-18 5万+
概念 keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 transition 相似,keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。 作用 在组件切换过程中将状态保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验性。 原理 在 created 函数调用时将需要缓存的 VNode 节点保存在 this.cache 中/在 render(页面渲染) 时,如果 VNode 的
keep-alive的作用和应用
m0_56698268的博客
03-22 2432
keep-alive的作用和应用
keep-alive属性及生命周期
qq_36262295的博客
12-23 1万+
保留组件状态,避免重新渲染 include 字符串或正则表达式,只有名称匹配的组件会被缓存 exclude 字符串或正则表达式,任何名称匹配的组件都不会被缓存 max 数字,最多可以缓存多少组件实例 <keep-alive include="test-keep-alive"> //将缓存name为test-keep-alive的组件 <component></component> </keep-alive> <keep-alive includ
vue列表页面缓存 keep-alive,列表跳转详情页面,列表页面缓存
高山景行,一尘不染
03-23 2067
A页面 B页面:列表页面 C页面:详情页面 需求A页面跳转B页面时,B页面需要加载最新数据;C页面跳转B页面时,B页面的数据是A页面跳转到B页面的数据 代码: router-view: <keep-alive> <router-view v-if="$route.meta.keepAlive" /> </keep-alive> <rout...
keep-alive不能缓存多层级路由菜单问题解决
11-21
然而,在多层级路由菜单的场景下,`keep-alive` 可能无法正常工作,尤其是在三层及以上的路由菜单结构中。这个问题通常出现在`router-view`的嵌套使用中,当在不同层级的`router-view`之间切换时,数据缓存可能会...
vue keep-alive 动态删除组件缓存的例子
10-16
根据提供的文件信息,以下是关于Vue中keep-alive组件缓存动态删除的知识点详细说明: 首先,什么是Vue中的keep-alive...希望这篇文章的示例能够帮助你更好地理解和应用Vue中的keep-alive组件缓存及其动态删除功能。
深入理解使用keep-alive(配合router-view缓存整个路由页面)
12-07
`<keep-alive>` 常常与动态组件`<component :is="...">` 结合使用,以控制哪些组件应该被缓存。例如: ```html <keep-alive> <component :is="currentView"></component> </keep-alive> ``` 在这个例子中,`...
keep-alive你了解多少?
lishushuai的博客
03-21 5034
文章目录 一、keep-alive是什么? 二、keep-alive属性 三、实现原理 总结 一、keep-alive是什么? keep-alive的是vue的一个内置实例,通过这个属性可以缓存的组建的v-node。这样做有什么用呢? 1.当你在对组件的反复切换的时候,去复用缓存的v-node,可以提高页面的渲染效率 2.可以防止在组件的切换的时候导致组件状态变化。 二、keep-alive属性 ke.
keep-alive 介绍
技术广场
05-06 6354
一、Keep-Alive是一种HTTP协议中的机制,它的作用是在客户端和服务器之间保持持久的网络连接,以减少连接建立和断开的开销。需要注意的是,Keep-Alive并非永久保持连接,而是在一定时间内保持连接处于打开状态,超过一定时间没有新的请求时,连接会自动关闭。总的来说,Keep-Alive通过保持持久连接,减少了连接建立和关闭的开销,提高了性能和响应时间,降低了网络负载,是提升HTTP通信效率的一种重要机制。这可能需要额外的逻辑来检测和处理断开的连接、超时连接等情况,增加了编程和管理的复杂性。
vue中的keep-alive详解与应用场景
唯见青山不见君
11-28 4327
vue中的keep-alive详解与应用场景
keep-alive的作用及原理
一个有节操的码农
10-18 1880
render所实现的大致功能是:首先获取keep-alive中包含组件的名称,然后和keep-alive定义的是否需要缓存的组件规则去配置;如果不需要缓存,则直接返回这个组件的vnode节点,否则的话则进行缓存,当下一次进入时候,再直接从缓存里取出来。
keep-alive
Zhoujia1316的博客
06-01 965
keep-alive的概念 keep-alive是一个抽象组件:它自身不会渲染一个DOM元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 作用 在组件切换过程中将状态保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验性 参数 Keep-alive 组件提供了 include 和 exclude 两个属性,允许组件有条件的进行缓存。 include: 字符串或正则表达式。只有匹配的组件会被缓存。 exclude: 字符串或正则
keep-alive怎么使用
09-10
keep-alive 是一种 HTTP 协议的特性,它允许在客户端和服务器之间的多个请求之间保持持久连接,从而减少了每个请求的延迟和资源消耗。在使用 keep-alive 时,客户端在发送请求后,服务器会保持连接打开一段时间,以便在同一个连接上接收来自客户端的多个请求。 在使用 keep-alive 时,可以通过以下几种方式进行配置: 1. 在服务器端配置:服务器可以通过设置响应头部的 "Connection: keep-alive" 字段来启用 keep-alive 功能。这样,服务器将会在响应中明确地告知客户端保持连接的时间。 2. 在客户端配置:客户端可以通过设置请求头部的 "Connection: keep-alive" 字段来请求服务器保持连接。大多数现代浏览器会默认启用 keep-alive 功能。 需要注意的是,keep-alive 功能在服务器和客户端之间的连接上保持活跃一段时间,并不意味着永远保持连接。一般情况下,服务器会在一定时间内保持连接(如 Apache 默认为 5 秒),超过该时间后会关闭连接。 值得注意的是,keep-alive 在一些场景下可能会导致一些问题,比如增加服务器资源占用、增加网络拥塞等。因此,在具体应用中需要根据实际情况评估是否使用 keep-alive 功能。
写文章

热门文章

  • PC端 -- 导航活动跳转 -- 锚点动画跳转 48393
  • Vue3 $set? 46711
  • Commitlint 使用总结 37323
  • Require statement not part of import statement.(@typescript-eslint/no-var-requires) 27624
  • Browserslist: caniuse-lite is outdated. Please run: npx update-browserslist-db@latest 24723

分类专栏

  • Vue3.x 62篇
  • 微前端 2篇
  • 安全 2篇
  • Vue1.x和Vue2.x 81篇
  • 每日专栏 226篇
  • 前端性能优化 14篇
  • Webpack 16篇
  • 微信小程序 41篇
  • ES6 36篇
  • 数组 12篇
  • JavaScript 150篇
  • Element Plus 3篇
  • Element UI 3篇
  • Ant Design 1篇
  • ESLint 2篇
  • 移动端开发常见问题 39篇
  • 正则系列 20篇
  • CSS3 55篇
  • HTML 31篇
  • Node.js 7篇
  • TypeScript 1篇
  • 思维散发 1篇
  • 算法 31篇
  • Git 7篇
  • HTTP 12篇
  • day  day up
  • VSCode 3篇
  • jQuery 2篇
  • 兼容适配IE 1篇
  • 面试题 4篇
  • 个人

最新评论

  • Vue2、Vue3 和 React 中 Diff 算法的区别

    weixin_43691626: 没有提及react的diff

  • Browserslist: caniuse-lite is outdated. Please run: npx update-browserslist-db@latest

    风宇起不来: 感谢,方法二很管用

  • 常见的 Vue Router 的导航钩子/ 路由导航守卫

    普通网友: 这篇文章真是一篇佳作!作者运用了生动有趣的语言,将枯燥的理论知识娓娓道来,让人如沐春风。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 实现简易的 axios

    普通网友: 大佬高质量文章,图文并茂,逻辑清晰,受益匪浅,期待大佬新作。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Browserslist: caniuse-lite is outdated. Please run: npx update-browserslist-db@latest

    镇冰: 我也是用的方法2

最新文章

  • 字符串转换为字节数组、16进制转换为base64、base64转换为字符串数组、base64转换为16进制(微信小程序)
  • 对 FileReader 的理解
  • 对 File 对象的理解
2024年15篇
2023年178篇
2022年13篇
2021年42篇
2020年121篇
2019年58篇
2018年24篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家镇江杯子型玻璃钢花盆三门峡不锈钢马玻璃钢彩绘雕塑玻璃钢雕塑度色怕水吗福建玻璃钢花盆园林玻璃钢雕塑出售浙江玻璃钢雕塑摆件多少钱珠海玻璃钢雕塑生产亳州玻璃钢雕塑销售厂家德州价值观玻璃钢人物雕塑中山财神爷人物玻璃钢雕塑青海园林玻璃钢雕塑制作昌吉玻璃钢雕塑制作厂家武汉玻璃钢人物大型不锈钢雕塑户外玻璃钢雕塑联系方式玻璃钢雕塑凳子厂家天津花钵玻璃钢雕塑厂家中山玻璃钢动物雕塑厂家现货仙桃佛像玻璃钢雕塑公园玻璃钢公仔雕塑图片鄂尔多斯玻璃钢雕塑厂家湖南长沙玻璃钢雕塑定做昆明定制玻璃钢雕塑生产厂家地址商场美陈 岗位清远玻璃钢楼盘景观雕塑加工佛山皇冠装饰玻璃钢雕塑东莞玻璃钢花盆批发价格玻璃钢雕塑骑士马北塘玻璃钢卡通雕塑商场功能性美陈黔东南玻璃钢花盆雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化