小程序笔记3

7 篇文章 0 订阅
订阅专栏

1.自定义组件

1.创建组件

  1. 在项目的根目录中,鼠标右键,创建 components -> test 文件夹
  2. 在新建的 components -> test 文件夹上,鼠标右键,点击“新建 Component”
  3. 键入组件的名称之后回车,会自动生成组件对应的 4 个文件,后缀名分别为 .js,.json,.wxml 和 .wxss

2.引用组件

  1. 局部引用:组件只能在当前被引用的页面内使用

    在页面的 .json 配置文件中引用组件的方式,叫做“局部引用”

    “usingComponents”: {
    “my-test1”: “/components/test/test”,
    }

  2. 全局引用:组件可以在每个小程序页面中使用

    app.json引用

    “usingComponents”: {
    “my-test1”: “/components/test/test”,
    }

3.组件和页面的区别

从表面来看,组件和页面都是由 .js、.json、.wxml 和 .wxss 这四个文件组成的。但是,组件和页面的 .js 与 .json 文件有明显的不同:

  1. 组件的 .json 文件中需要声明 “component”: true 属性
  2. 组件的 .js 文件中调用的是 Component() 函数,app.js(App()),页面Page()
  3. 组件的事件处理函数需要定义到 methods 节点中

4.自定义组件样式

  1. 组件样式隔离(组件之间或者组件和页面之间样式互不影响,只针对样式选择器)

  2. 组件样式隔离的注意点

    • app.wxss 中的全局样式对组件无效
    • 只有 class 选择器会有样式隔离效果,id 选择器、属性选择器、标签选择器不受样式隔离的影响
  3. 修改组件的样式隔离选项

Component({
     options: {
       styleIsolation: 'shared'
     }

在这里插入图片描述

页面给组件传值

<my-test1 max="9"></my-test1>
//组件
properties: {
// 第一种方式:简化的方式
// max: Number
// 第二种方式:完整的定义方式
    max: {
      type: Number,
      value: 10
    }  
},

5.数据监听器

数据监听器用于监听和响应任何属性和数据字段的变化,从而执行特定的操作。它的作用类似于 vue 中的 watch 侦听器

observers: {
‘n1, n2’: function (newN1, newN2) {
this.setData({
sum: newN1 + newN2
})
}
}

  1. 监听对象中指定属性的变化

    ‘’rgb.r,rgb.b"…

  2. 监听对象中所有属性的变化

    使用通配符 ** 来监听对象中所有属性的变化

    “rgb.**”:…

6.纯数据字段

  • 概念:纯数据字段指的是那些不用于界面渲染的 data 字段,

  • 应用场景:例如有些情况下,某些 data 中的字段既不会展示在界面上,也不会传递给其他组件,仅仅在当前组件内部使用。带有这种特性的 data 字段适合被设置为纯数据字段。

  • 好处:纯数据字段有助于提升页面更新的性能。

  • 使用规则:在 Component 构造器的 options 节点中,指定 pureDataPattern 为一个正则表达式,字段名符合这个正则表达式的字段将成为纯数据字段(data、methods…中符合规则的)

  • 例子

    options: {
    pureDataPattern: /^_/
    },

    data: {
    _rgb: {
    r: 0,
    g: 0,
    b: 0
    },

    7.生命周期

    在小程序组件中,最重要的生命周期函数有 3 个,分别是 created、attached、detached。它们各自的特点如下:

    • 组件实例刚被创建好的时候,created 生命周期函数会被触发
      此时还不能调用 setData
      通常在这个生命周期函数中,只应该用于给组件的 this 添加一些自定义的属性字段
    • 在组件完全初始化完毕、进入页面节点树后, attached 生命周期函数会被触发
      此时, this.data 已被初始化完毕
      这个生命周期很有用,绝大多数初始化的工作可以在这个时机进行(例如发请求获取初始数据)
    • 在组件离开页面节点树后, detached 生命周期函数会被触发
      退出一个页面时,会触发页面内每个自定义组件的 detached 生命周期函数
      此时适合做一些清理性质的工作
      - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yoaVNabr-1659496958698)(C:\Users\syhgly\AppData\Roaming\Typora\typora-user-images\1659444077111.png)]

8.lifetimes 节点

在小程序组件中,生命周期函数可以直接定义在 Component 构造器的第一级参数中,可以在 lifetimes 字段内进行声明(这是推荐的方式,其优先级最高)

9.组件所在页面的生命周期

自定义组件的行为依赖于页面状态的变化,此时就需要用到组件所在页面的生命周期。

10.pageLifetimes 节点

组件所在页面的生命周期函数,需要定义在 pageLifetimes 节点中

11.插槽

在自定义组件的 wxml 结构中,可以提供一个 节点(插槽),用于承载组件使用者提供的 wxml 结构。

  • 单个插槽–在小程序中,默认每个自定义组件中只允许使用一个 进行占位,这种个数上的限制叫做单个插槽。

  • 启用多个插槽–组件的 .js 文件中开启

  Component({
    options: {
      multipleSlots: true
    },
  })
  //例子  -通过具名使用
  <slot name="A"></slot> 
  <view slot="before">***</view>

配合 -----***

12.父子组件之间通信

  1. 属性绑定(父->子)

    父组件

    count=“{{count}}”

    子组件

    properties: {
    count: Number
    },

  2. 事件绑定

    bind:sync=“syncCount”||bindsync=“syncCount”

    父组件(通过 e.detail 获取到子组件传递过来的数据)

    sysncCount(e)

    子组件(通过调用 this.triggerEvent(‘自定义事件名称’, { /* 参数对象 */ }) ,将数据发送到父组件)

    this.triggerEvent(‘sync’, { value: this.properties.count })

  3. 获组件实例

    可在父组件里调用 this.selectComponent(“id或class选择器”) ,获取子组件的实例对象,从而直接访问子组件的任意数据和方法。调用时需要传入一个选择器,例如 this.selectComponent(“.my-component”)。

wxml:   class="customA" id="cA"

   父组件

   getChild() {
       const child = this.selectComponent('#cA')
       console.log(child)
       // child.setData({
       //   count: child.properties.count + 1
       // })
       child.addCount()
     },

13.behaviors

  1. 简介

    用于实现组件间代码共享的特性,类似于 Vue.js 中的 “mixins”

  2. behaviors 的工作方式

    每个 behavior 可以包含一组属性、数据、behavior 、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被合并到组件中。
    每个组件可以引用多个 behaviorbehavior 也可以引用其它 behavior

  3. 创建behavior

    调用 Behavior(Object object) 方法即可创建一个共享的 behavior 实例对象,供所有的组件使用

 my-behavior.js
  module.exports = Behavior({
    data: {
      username: 'zs'
    },
    properties: {},
    methods: {}
  })
//组件
  const myBehavior = require('../../behaviors/my-behavior')
  Component({
    behaviors: [myBehavior],
  }
  1. 同名字段的覆盖和组合规则

    当组件触发生命周期时,上例生命周期函数执行顺序为:

    1. [my-behavior] created
    2. [my-component] created
    3. [my-behavior] attached
    4. [my-component] attached
    5. [my-behavior] ready
    6. [my-component] ready

    组件和它引用的 behavior 中可以包含同名的字段

    1. 同名的数据字段 (data)
      • 同名的数据字段都是对象类型,会进行对象合并
      • 其余情况会进行数据覆盖,覆盖规则为: **引用者 behavior > 被引用的 behavior靠后的 behavior > 靠前的 behavior**。(优先级高的覆盖优先级低的,最大的为优先级最高)
    2. 同名的属性 (properties) 或方法 (methods)
      1. 组件本身有这个属性或方法,则组件的属性或方法会覆盖 behavior 中的同名属性或方法;
      2. 若组件本身无这个属性或方法,则在组件的 behaviors 字段中定义靠后的 behavior 的属性或方法会覆盖靠前的同名属性或方法;
    3. 同名的生命周期函数
      1. 对于不同的生命周期函数之间,遵循组件生命周期函数的执行顺序
      2. 对于同种生命周期函数,遵循如下规则
        • behavior 优先于组件执行;
        • 被引用的 behavior 优先于 引用者 behavior 执行;
        • 靠前的 behavior 优先于 靠后的 behavior 执行;
      3. 如果同一个 behavior 被一个组件多次引用,它定义的生命周期函数只会被执行一次

2.使用那npm包

  1. 小程序对 npm 的支持与限制

    总结:虽然 npm 上的包有千千万,但是能供小程序使用的包却“为数不多”。

    • 不支持依赖于 Node.js 内置库的包
    • 不支持依赖于浏览器内置对象的包
    • 不支持依赖于 C++ 插件的包
  2. Vant Weapp

    • 介绍:Vant Weapp 是有赞前端团队开源的一套小程序 UI 组件库,助力开发者快速搭建小程序应用。它所使用的是 MIT 开源许可协议,对商业使用比较友好。
      官方文档地址

    • 安装

      • 通过 npm 安装(建议指定版本为@1.3.3(不要是最新的))

      • 构建 npm 包

      • 修改 app.json(使用组件)

        “usingComponents”: {
        “van-button”: “@vant/weapp/button/index”,

        }

      • 详细的操作步骤,大家可以参考 Vant 官方提供的快速上手教程:

  3. 定制全局主题样式

    Vant Weapp 使用 CSS 变量来实现定制主题。 关于 CSS 变量的基本用法,请参考 MDN 文档

  4. 使用 npm 包进行API Promise优化

    • 基于回调函数的异步 API 的缺点
      在这里插入图片描述

    缺点:容易造成回调地狱的问题,代码的可读性、维护性差!

    • API Promise 优化-升级改造为基于 Promise 的异步 API

      在小程序中,实现 API Promise 优化主要依赖于 miniprogram-api-promise 这个第三方的 npm 包。它的安装和使用步骤如下:
      在这里插入图片描述

3.全局数据共享

  1. 简介

    全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题。
    开发中常用的全局数据共享方案有:Vuex、Redux、MobX 等

  2. 小程序中的全局数据共享方案(Mobx)

    在小程序中,可使用 mobx-miniprogram 配合 mobx-miniprogram-bindings 实现全局数据共享。其中:

    • mobx-miniprogram 用来创建 Store 实例对象
    • mobx-miniprogram-bindings 用来把 Store 中的共享数据或方法,绑定到组件或页面中使用
  3. 使用步骤

    • 安装包

      npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1

      注意:MobX 相关的包安装完毕之后,记得删除 miniprogram_npm 目录后,重新构建 npm。

    • 创建Mobx的store实例

      // 在这个 JS 文件中,专门来创建 Store 的实例对象

import { observable, action } from 'mobx-miniprogram'
 export const store = observable({
   // 数据字段
   numA: 1,
   numB: 2,
   activeTabBarIndex: 0,
   // 计算属性
   get sum() {
     return this.numA + this.numB
   },
   // actions 函数,专门来修改 store 中数据的值
   updateNum1: action(function (step) {
     this.numA += step
   }),
   updateNum2: action(function (step) {
     this.numB += step
   }),
   updateActiveTabBarIndex: action(function(index) {
     this.activeTabBarIndex = index
   })
 })
  • 将 Store 中的成员绑定到页面中
  // pages/message/message.js
     import { createStoreBindings } from 'mobx-miniprogram-bindings'
     import { store } from '../../store/store'

     Page({
       onLoad: function (options) {
	     this.storeBindings = createStoreBindings(this, {
	       store,
	       fields: ['numA', 'numB', 'sum'],
	       actions: ['updateNum1']
	     })
       },

       btnHandler1(e) {
         // console.log(e)
         this.updateNum1(e.target.dataset.step)
       }
     }
  • 在页面上使用 Store 中的成员
 <view>{{numA}} + {{numB}} = {{sum}}</view>
 <van-button type="primary" bindtap="btnHandler1" data-step="{{1}}">numA + 1</van-button>
 <van-button type="danger" bindtap="btnHandler1" data-step="{{-1}}">numA - 1</van-button>
  • 将 Store 中的成员绑定到组件中
  	 import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
     import { store } from '../../store/store'
     Component({
       behaviors: [storeBindingsBehavior],
       storeBindings: {
         store,
         fields: {
           numA: 'numA',
           numB: 'numB',
           sum: 'sum'
         },
         actions: {
           updateNum2: 'updateNum2'
         }
       },
     methods: {
         btnHandler2(e) {
           this.updateNum2(e.target.dataset.step)
         }
       }
     })
  • 在组件中使用 Store 中的成员
 <view>{{numA}} + {{numB}} = {{sum}}</view>
 <van-button type="primary" bindtap="btnHandler2" data-step="{{1}}">numB + 1</van-button>
 <van-button type="danger" bindtap="btnHandler2" data-step="{{-1}}">numB - 1</van-button>

4.分包

  1. 简介

    分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载

  2. 分包的好处

    • 可以优化小程序首次启动的下载时间
    • 在多团队共同开发时可以更好的解耦协作
  3. 分包前项目的构成

    分包前,小程序项目中所有的页面和资源都被打包到了一起,导致整个项目体积过大,影响小程序首次启动的下载时间

  4. 分包后项目的构成

    分包后,小程序项目由 1 个主包 + 多个分包组成
    主包:一般只包含项目的启动页面或 TabBar 页面、以及所有分包都需要用到的一些公共资源
    分包:只包含和当前分包有关的页面和私有资源

  5. 分包的加载规则

    • 在小程序启动时,默认会下载主包并启动主包内页面

      tabBar 页面需要放到主包中

    • 当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示

      非 tabBar 页面可以按照功能的不同,划分为不同的分包之后,进行按需下载

    • 分包的体积限制

      • 整个小程序所有分包大小不超过 16M(主包 + 所有分包)
      • 单个分包/主包大小不能超过 2M
  6. 配置方法(使用分包)

  7. 打包原则(使用分包)

    • 小程序会按 subpackages 的配置进行分包,subpackages 之外的目录将被打包到主包中
    • 主包也可以有自己的 pages(即最外层的 pages 字段)
    • tabBar 页面必须在主包内
    • 分包之间不能互相嵌套
  8. 引用原则(使用分包)

    主包无法引用分包内的私有资源
    分包之间不能相互引用私有资源
    分包可以引用主包内的公共资源

  9. 独立分包

    • 简介

      独立分包本质上也是分包,只不过它比较特殊,可以独立于主包和其他分包而单独运行

    • 独立分包和普通分包的区别

      最主要的区别:是否依赖于主包才能运行
      普通分包必须依赖于主包才能运行
      独立分包可以在不下载主包的情况下,独立运行

  10. 独立分包的应用场景

    开发者可以按需,将某些具有一定功能独立性的页面配置到独立分包中。原因如下:
    当小程序从普通的分包页面启动时,需要首先下载主包
    独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速度
    注意:一个小程序中可以有多个独立分包。

  11. 独立分包的配置方法

在这里插入图片描述

  1. 独立分包引用原则

    独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源!例如:
    主包无法引用独立分包内的私有资源
    独立分包之间,不能相互引用私有资源
    独立分包和普通分包之间,不能相互引用私有资源
    特别注意:独立分包中不能引用主包内的公共资源

  2. 分包预下载

    简介

    在进入小程序的某个页面时,由框架自动预下载可能需要的分包,从而提升进入后续分包页面时的启动速度

  3. 配置分包的预下载

    预下载分包的行为,会在进入指定的页面时触发。在 app.json 中,使用 preloadRule 节点定义分包的预下载规则,示例代码如下:
    在这里插入图片描述

  4. 分包预下载的限制

    同一个分包中的页面享有共同的预下载大小限额 2M

微信小程序Demo:LifeTime
07-12
微信小程序Demo:LifeTime
小程序笔记.小程序笔记
06-29
小程序笔记.小程序笔记
小程序生命周期
Raccon_的博客
03-30 372
生命周期 小程序中生命周期分为两类 应用的生命周期 小程序从启动 -> 运行 ->销毁的过程 页面的生命周期 每个页面的加载-> 渲染-> 销毁的过程 应用的生命周期函数 // app.js文件 App({ // 小程序初始化完成时,执行此函数,全局触发一次,可以做一些初始化操作 onLaunch: function(options){ }, // 小程序启动,或从后台进入前台显示时触发 onShow: function(options){ }, //
【微信小程序】自定义组件 - 组件所在页面的生命周期
最新发布
weixin_40874076的博客
08-19 252
【代码】【微信小程序】自定义组件 - 组件所在页面的生命周期。
微信小程序 ---- 生命周期
每天都要努力学习哦~~
02-23 4991
应用生命周期是指应用程序进程从创建到消亡的整个过程小程序的生命周期指的是 小程序从启动到销毁的整个过程在打开一个小程序应用的时候都需要经历一系列的初始化步骤,比如页面是否加载完成、页面是否初次渲染完成等等。在此过程中,小程序也会运行被称为生命周期钩子的函数,这些函数由小程序框架本身提供,被称为生命周期函数,生命周期函数会按照顺序依次自动触发调用。帮助程序员在特定的时机执行特定的操作,辅助程序员完成一些比较复杂的逻辑。让开发者有机会在特定阶段运行自己的代码。
微信小程序的组件的生命周期
实践求真知
09-11 9420
微信小程序
小程序的页面/组件的生命周期
浩星
10-28 1518
小程序的页面生命周期与组件生命周期
小程序源码 云笔记 (代码+截图)
06-19
小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+...
微信小程序——云笔记(截图+源码).zip
05-05
微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序——云笔记(截图+源码).zip 微信小程序...
微信小程序笔记 (源码)
05-31
微信小程序笔记 (源码)微信小程序笔记 (源码)微信小程序笔记 (源码)微信小程序笔记 (源码)微信小程序笔记 (源码)微信小程序笔记 (源码)微信小程序笔记 (源码)微信小程序笔记 (源码)微信小...
尚硅谷微信小程序课堂笔记.zip
07-02
尚硅谷微信小程序课堂笔记.zip
微信小程序——组件生命周期
热门推荐
weixin_42289080的博客
09-18 1万+
查看微信小程序官网内容,请点击 小程序官方组件生命周期 一、组件生命周期 组件生命周期是组件自身的一些函数: 组件实例刚被创建好,执行created,此时还不能调用setData 在组件完全初始化完毕、进入页面节点树后,执行attached,this.data 已被初始化,绝大多数初始化工作可以在这个时机进行(这个生命周期可以做一些异步请求、数据更新) 在组件离开页面节点树后, detached 生命周期被触发。退出一个页面时,如果组件还在页面节点树中,则 detached 会被触发。 具体的写法.
【菜狗日记】微信小程序开发— 程序、页面、组件的生命周期函数
Visary的博客
09-05 205
微信小程序开发 — 程序(App)、页面(Page)、组件(Component)的生命周期函数
微信小程序-自定义组件生命周期
weixin_42284031的博客
07-19 660
组件实例创建完毕调用。定义在lifetimes对象里。不能在方法里面更改data对象里面的值,但是可以定义属性值。
入门微信小程序三(自定义组件)
十九万里的博客
04-22 1130
1、组件的创建 ① 在项目的根目录中,鼠标右键,创建 components -> test 文件夹 ② 在新建的 components -> test 文件夹上,鼠标右键,点击“新建 Component” ③ 键入组件的名称之后回车,会自动生成组件对应的 4 个文件,后缀名分别为 .js,.json, .wxml 和 .wxss 注意:为了保证目录结构的清晰,建议把不同的组件,存放到单独目录中,例如: 2、引用组件 组件的引用方式分为“局部引用”和“全局引用”,顾名思义: ⚫ 局部引用:
微信小程序中组件的知识点汇总(lifetimes,externalClasses,observers,selectComponent,componentGenerics。。。)
qq_40637612的博客
12-18 5043
1、组件也有它的生命周期(lifetimes) 自小程序基础版本2.2.3起,组件的生命周期可以在lifetimes字段中声明(这是推荐的方式,优先级最高) lifetimes: { created: function () { // 组件实例化,但节点树还未导入,因此这时不能用setData }, attached: function () { ...
小程序-基础加强(一):自定义组件
a_xia_o的博客
05-13 220
①在项目的根目录中,鼠标右键,创建文件夹②在新建的conponents->test文件夹上,鼠标右键,点击“新建Component③键入组件的名称之后回车,会自动生成组件对应的4个文件,后缀名分别为.js、.json、.wxml和.wxss样式数据、方法和属性数据监听器数据监听器用于监听 和响应任何属性和数据字段的变化,从而执行特定的操作。它的作用类似于vue中的watch监听器。
微信小程序组件初始化的生命周期lifetimes和pageLifetimes的区别
liu18130617928的博客
01-13 1万+
lifetimes lifetimes: { attached: function () { try { // 需要在初始化的时候做的操作 } catch (e) { } console.log('lifetimes执行了qqq') // 在组件实例进入页面节点树时执行 }, detached: function () { // 在组件实例被从页面节点树移除时执行 }, }, 这个
"2022年微信小程序开发教程笔记及全面概述
下面是我对微信小程序开发的一些笔记,包括微信小程序的概述和新增属性等内容。这些笔记将帮助你更好地理解微信小程序开发的基本概念和技术要点,为你的实际开发工作提供指导和帮助。 微信小程序开发 - 1 微信小...
写文章

热门文章

  • 写个程序,要求创建一个文件,写入从键盘输入的一串字符,然后再读该文件并将文件内容显示在屏幕上 19764
  • vue+axios每次都重复请求两次 7517
  • cnpm和package-lock.json踩过的坑 4896
  • 开箱即用 4862
  • vue之在页面中监听键盘的Enter键来触发某个事件 2945

分类专栏

  • js+ts 8篇
  • 工作+面试 9篇
  • 面试 4篇
  • 微信小程序 7篇
  • react 3篇
  • vue 13篇
  • Echarts 4篇
  • 随笔 8篇
  • 踩坑 1篇
  • css 1篇
  • java 3篇

最新评论

  • provide/inject响应式实现

    白日梦想家397: 这里子组件的this指向不会变吗

  • webSocket学习与使用

    小叶_01: 表情包,谢谢哈,已回访!

  • webSocket学习与使用

    Baker-Chen: 写的太棒了,非常实用,期待大佬回访表情包

  • cnpm和package-lock.json踩过的坑

    chinoukin: 可以先用cnpm install,再用npm install,之后把package.json和package-lock.json一起提交了

  • cnpm和package-lock.json踩过的坑

    zhuxueluo: 弃用cnpm,用npm。不能fanqiang的话设置一下repo用taobao的就好了

大家在看

  • 递推算法与递归算法
  • 开源工具Stirling PDF本地Docker部署并实现远程管理PDF文档 1010
  • 梯度下降算法 23
  • 偶数、奇数、整数与指数
  • 给互联网迷茫的朋友一点建议 1

最新文章

  • ts入门学习
  • webstorm2019激活码
  • 刷算法常见注意点
2023年15篇
2022年26篇
2020年2篇
2019年8篇
2018年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司肇庆百度搜索网站优化兰州企业网站优化的运用方法郑州家居行业网站优化推广有哪些网站用户使用体验优化沧州网站优化企业福州seo网站排名优化公司google网站优化工具邹平网站优化排名公司东莞地产网站seo优化公司网站建设优化案例手机网站 优化辽宁网站优化推广有什么技巧网站优化的六大流程汉川网站优化推广公司企业网站的优化排名奉化区网站优化报价邢台网站优化设计网站推广大熊猫优化网站优化排名哪里靠谱小程序优化网站网站关键词优化注意哪些问题湘乡网站优化怎样优化网站搜索关键词网站排名优化就找金手指信誉潮州外贸网站关键词优化哪家好游戏行业网站优化策划宝山区公司网站优化价格成功的网站建设及优化网站快速优化记好易速达海南网站优化电池充电歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化