课程简介:
全部都是干货的小程序开发课程,来自一线大厂的讲师与技术,让同学们能够学习和掌握到最实用的小程序开发技术。课程内容从第一个程序的开发细节讲起,到实用小案例的教学,深入到自定义组件的开发,使用npm包、全局数据共享、自定义tabBar、宿主环境、数据绑定、微信小程序协同工作和发布、微信小程序生命周期和wxs,以及小程序开发案例实战,可以让同学们学到最新的一线开发技术。
课程目录:
├──1-1 微信小程序快速入门
| ├──00.学习目标.mp4 4.02M
| ├──01.小程序简介 – 小程序与普通网页开发的区别.mp4 8.83M
| ├──02.小程序简介 – 体验微信小程序.mp4 7.84M
| ├──03.第一个小程序 – 了解注册小程序开发账号的流程.mp4 10.50M
| ├──04.第一个小程序 – 获取小程序的AppID.mp4 8.25M
| ├──05.第一个小程序 – 安装微信开发者工具.mp4 12.08M
| ├──06.第一个小程序 – 扫码登录到微信开发者工具.mp4 3.65M
| ├──07.第一个小程序 – 设置外观和代理.mp4 5.55M
| ├──08.第一个小程序 – 演示新建小程序项目的步骤.mp4 10.23M
| ├──09.第一个小程序 – 查看项目运行效果的两种方式.mp4 7.56M
| ├──10.第一个小程序 – 了解微信开发者工具主界面的5个组成部分.mp4 21.36M
| ├──11.小程序代码的构成 – 了解项目的基本组成结构.mp4 9.48M
| ├──12.小程序代码的构成 – 小程序页面的组成部分.mp4 7.94M
| ├──13.小程序代码的构成 – 认识小程序中的4种配置文件.mp4 7.03M
| ├──14.小程序代码的构成 – app.json文件.mp4 12.00M
| ├──15.小程序代码的构成 – project.config.json文件.mp4 12.59M
| ├──16.小程序代码的构成 – sitemap.json文件.mp4 13.85M
| ├──17.小程序代码的构成 – 页面的.json配置文件.mp4 8.49M
| ├──18.小程序代码的构成 – 新建小程序页面.mp4 7.52M
| ├──19.小程序代码的构成 – 修改项目首页.mp4 4.59M
| ├──20.小程序代码的构成 – WXML的概念以及和HTML之间的区别.mp4 6.72M
| ├──21.小程序代码的构成 – WXSS的概念以及和CSS之间的区别.mp4 10.48M
| └──22.小程序代码的构成 – 了解小程序中JS文件的三大分类.mp4 8.19M
├──1-10 本地生活综合案例
| ├──39.案例 – 商铺列表页面的效果演示.mp4 20.87M
| ├──40.案例 – 把项目代码加载到微信开发者工具中.mp4 5.09M
| ├──41.案例 – 实现导航跳转并传参.mp4 20.75M
| ├──42.案例 – 动态设置商铺列表页面的标题内容.mp4 28.94M
| ├──43.案例 – 创建商铺列表页面的编译模式.mp4 4.10M
| ├──44.案例 – 了解API接口并定义需要的数据节点.mp4 12.31M
| ├──45.案例 – 定义getShopList方法获取商品列表数据.mp4 26.79M
| ├──46.案例 – 渲染商铺列表的UI结构并美化样式.mp4 48.45M
| ├──47.案例 – 展示loading提示效果.mp4 8.74M
| ├──48.案例 – 上拉触底时请求下一页数据.mp4 17.97M
| ├──49.案例 – 对上拉触底事件进行节流控制.mp4 20.62M
| ├──50.案例 – 演示并分析数据加载的问题.mp4 16.25M
| ├──51.案例 – 介绍判断是否还有下一页数据的公式.mp4 7.43M
| ├──52.案例 – 根据公式判断是否还有下一页的数据.mp4 17.00M
| ├──53.案例 – 为商铺列表页面开启下拉刷新效果.mp4 9.65M
| ├──54.案例 – 实现下拉刷新的功能.mp4 13.78M
| ├──55.案例 – 解决下拉刷新窗口效果不会自动关闭的问题.mp4 39.65M
| ├──56.案例 – 使用wxs处理手机号.mp4 34.41M
| └──57.总结.mp4 5.06M
├──1-11 微信小程序组件和样式
| ├──00.学习目标-1603532592.mp4 3.76M
| ├──01.准备今天要用到的项目.mp4 2.20M
| ├──02.自定义组件 – 组件的创建与引用 – 创建自定义组件.mp4 7.77M
| ├──03.自定义组件 – 组件的创建与引用 – 局部引用组件.mp4 10.17M
| ├──04.自定义组件 – 组件的创建与引用 – 全局引用组件.mp4 6.87M
| ├──05.自定义组件 – 组件的创建与引用 – 全局引用VS局部引用.mp4 3.44M
| ├──06.自定义组件 – 组件的创建与引用 – 组件和页面的区别.mp4 7.01M
| ├──07.自定义组件 – 样式 – 组件的样式隔离特性.mp4 3.70M
| ├──08.自定义组件 – 样式 – 组件样式隔离的注意点.mp4 9.03M
| └──09.自定义组件 – 样式 – 修改组件的样式隔离选项.mp4 16.65M
├──1-12 微信小程序数据、方法、属性和数据监听
| ├──10.自定义组件 – 数据、方法、属性 – 定义data私有数据.mp4 3.32M
| ├──11.自定义组件 – 数据、方法、属性 – methods方法.mp4 17.17M
| ├──12.自定义组件 – 数据、方法、属性 – 定义properties属性.mp4 12.78M
| ├──13.自定义组件 – 数据、方法、属性 – 使用max属性控制自增的最大值.mp4 4.88M
| ├──14.自定义组件 – 数据、方法、属性 – data和properties的区别.mp4 10.91M
| ├──15.自定义组件 – 数据、方法、属性 – 使用setData修改properties的值.mp4 7.92M
| ├──16.自定义组件 – 数据监听器 – 什么是数据监听器及其语法格式.mp4 3.33M
| ├──17.自定义组件 – 数据监听器 – 数据监听器的基本用法.mp4 23.92M
| └──18.自定义组件 – 数据监听器 – 监听对象属性的变化.mp4 5.77M
├──1-13 微信小程序数据监听案例
| ├──19.自定义组件 – 数据监听器案例 – 创建组件并定义数据.mp4 10.53M
| ├──20.自定义组件 – 数据监听器案例 – 渲染组件的UI结构.mp4 13.22M
| ├──21.自定义组件 – 数据监听器案例 – 定义button的事件处理函数.mp4 15.40M
| ├──22.自定义组件 – 数据监听器案例 – 监听对象中指定属性的变化.mp4 11.09M
| ├──23.自定义组件 – 数据监听器案例 – 监听对象中所有属性的变化.mp4 7.69M
| ├──24.自定义组件 – 纯数据字段 – 什么是纯数据字段.mp4 6.31M
| ├──25.自定义组件 – 纯数据字段 – 使用规则.mp4 4.44M
| └──26.自定义组件 – 纯数据字段 – 使用纯数据字段改造数据监听器案例.mp4 8.58M
├──1-14 组件生命周期和插槽
| ├──27.自定义组件 – 组件的生命周期 – 组件全部的生命周期函数.mp4 10.53M
| ├──28.自定义组件 – 组件的生命周期 – 组件主要的生命周期函数.mp4 7.72M
| ├──29.自定义组件 – 组件的生命周期 – lifetimes节点.mp4 10.94M
| ├──30.自定义组件 – 组件所在页面的生命周期 – 概念.mp4 6.11M
| ├──31.自定义组件 – 组件所在页面的生命周期 – pageLifetimes节点.mp4 8.43M
| ├──32.自定义组件 – 组件所在页面的生命周期 – 生成随机的RGB颜色值.mp4 16.70M
| ├──33.自定义组件 – 插槽 – 什么是插槽.mp4 3.54M
| ├──34.自定义组件 – 插槽 – 单个插槽.mp4 12.78M
| ├──35.自定义组件 – 插槽 – 启用多个插槽.mp4 3.79M
| └──36.自定义组件 – 插槽 – 定义和使用多个插槽.mp4 10.86M
├──1-15 父子组件通信和behaviors
| ├──37.自定义组件 – 父子组件通信 – 了解父子组件之间通信的3种方式.mp4 3.75M
| ├──38.自定义组件 – 父子组件通信 – 属性绑定.mp4 16.13M
| ├──39.自定义组件 – 父子组件通信 – 实现子组件的count属性自增+1.mp4 5.72M
| ├──40.自定义组件 – 父子组件通信 – 了解事件绑定的4个核心实现步骤.mp4 4.80M
| ├──41.自定义组件 – 父子组件通信 – 了解事件绑定的核心实现代码.mp4 7.49M
| ├──42.自定义组件 – 父子组件通信 – 通过事件绑定实现count值的同步.mp4 20.09M
| ├──43.自定义组件 – 父子组件通信 – 使用selectComponent获取组件实例.mp4 23.94M
| ├──44.自定义组件 – behaviors – 了解什么是behaviors以及它的工作方式.mp4 4.42M
| ├──45.自定义组件 – behaviors – 创建behavior.mp4 6.06M
| ├──46.自定义组件 – behaviors – 导入并使用behavior.mp4 8.93M
| ├──47.自定义组件 – behaviors – 了解behavior中所有可用的节点.mp4 3.44M
| ├──48.自定义组件 – behaviors – 同名字段的覆盖和组合规则.mp4 12.58M
| └──49.自定义组件 – 总结.mp4 7.09M
├──1-16 vant 小程序 UI 组件库和API的Promise化
| ├──01.导入需要用到的小程序项目.mp4 2.58M
| ├──02.使用npm包 – 小程序中对npm的支持与限制.mp4 4.47M
| ├──03.使用npm包 – vant – 了解什么是Vant Weapp.mp4 6.64M
| ├──04.使用npm包 – vant – 安装Vant组件库.mp4 26.25M
| ├──05.使用npm包 – vant – 使用Vant组件.mp4 10.19M
| ├──06.使用npm包 – vant – 定义和使用CSS变量.mp4 24.34M
| ├──07.使用npm包 – vant – 使用CSS变量定制Vant的主题样式.mp4 22.80M
| ├──08.使用npm包 – API的Promise化 – 什么是小程序API的Promise化.mp4 3.57M
| ├──09.使用npm包 – API的Promise化 – 安装并构建miniprogram-api-promise.mp4 9.15M
| ├──10.使用npm包 – API的Promise化 – 三个步骤实现API的Promise化.mp4 11.58M
| └──11.使用npm包 – API的Promise化 – 调用Promise化之后的异步API.mp4 18.59M
├──1-17 微信小程序全局数据共享
| ├──12.全局数据共享 – 什么是全局数据共享.mp4 4.84M
| ├──13.全局数据共享 – 小程序中的全局数据共享方案.mp4 5.10M
| ├──14.全局数据共享 – 安装并构建MobX相关的包.mp4 8.13M
| ├──15.全局数据共享 – 创建Store实例对象.mp4 8.75M
| ├──16.全局数据共享 – 定义计算属性.mp4 7.25M
| ├──17.全局数据共享 – 定义actions方法.mp4 14.44M
| ├──18.全局数据共享 – 了解将Store中的成员绑定到页面上的实现思路.mp4 9.40M
| ├──19.全局数据共享 – 将Store中的成员绑定到页面上.mp4 19.38M
| ├──20.全局数据共享 – 在页面中使用Store中的成员.mp4 21.00M
| ├──21.全局数据共享 – 了解将Store中的成员绑定到组件上的实现思路.mp4 6.43M
| ├──22.全局数据共享 – 将Store中的成员绑定到组件上.mp4 26.05M
| └──23.全局数据共享 – 在组件中使用Store中的成员.mp4 8.65M
├──1-18 分包
| ├──24.分包 – 基础概念 – 了解分包的概念以及好处.mp4 2.80M
| ├──25.分包 – 基础概念 – 分包前后项目的构成.mp4 5.35M
| ├──26.分包 – 基础概念 – 分包的加载规则.mp4 2.39M
| ├──27.分包 – 基础概念 – 分包的体积限制.mp4 1.52M
| ├──28.分包 – 使用分包 – 了解如何配置分包.mp4 6.91M
| ├──29.分包 – 使用分包 – 演示在项目中如何配置分包.mp4 14.93M
| ├──30.分包 – 使用分包 – 设置分包的别名并查看分包的体积.mp4 8.19M
| ├──31.分包 – 使用分包 – 打包原则.mp4 5.59M
| ├──32.分包 – 使用分包 – 引用原则.mp4 2.62M
| ├──33.分包 – 独立分包 – 了解什么是独立分包以及它和普通分包的区别.mp4 4.31M
| ├──34.分包 – 独立分包 – 了解独立分包的应用场景.mp4 2.75M
| ├──35.分包 – 独立分包 – 将普通分包改造为独立分包.mp4 4.51M
| ├──36.分包 – 独立分包 – 独立分包的引用原则.mp4 3.12M
| ├──37.分包 – 分包预下载 – 介绍分包预下载的概念以及好处.mp4 3.63M
| ├──38.分包 – 分包预下载 – 配置分包的预下载.mp4 18.08M
| └──39.分包 – 分包预下载 – 分包预下载的限制.mp4 4.35M
├──1-19 自定义tabBar
| ├──40.自定义tabBar – 演示案例效果.mp4 3.78M
| ├──41.自定义tabBar – 了解自定义tabBar的实现步骤.mp4 7.78M
| ├──42.自定义tabBar – 在app.json中声明自定义tabBar的配置信息.mp4 12.09M
| ├──43.自定义tabBar – 添加tabBar的代码文件.mp4 7.62M
| ├──44.自定义tabBar – 基于Vant组件渲染出基本的自定义tabBar效果.mp4 14.88M
| ├──45.自定义tabBar – 自定义tabBar的图标和文本.mp4 14.34M
| ├──46.自定义tabBar – 循环渲染tabBar的Item项.mp4 12.50M
| ├──47.自定义tabBar – 渲染并美化数字徽标的样式.mp4 34.24M
| ├──48.自定义tabBar – 按需渲染数字徽标.mp4 10.63M
| ├──49.自定义tabBar – 把Store中sum的值渲染为数字徽标.mp4 26.34M
| ├──50.自定义tabBar – 实现tabBar页面的切换.mp4 10.11M
| ├──51.自定义tabBar – 使用全局数据共享解决tabBar选中项不准确的问题.mp4 18.44M
| ├──52.自定义tabBar – 修改tabBar选中项文本的颜色值.mp4 6.48M
| └──53.总结.mp4 3.84M
├──1-2 微信小程序的宿主环境
| ├──23.宿主环境 – 了解宿主环境的概念.mp4 4.75M
| ├──24.宿主环境 – 小程序的宿主环境.mp4 4.95M
| ├──25.宿主环境 – 通信的主体.mp4 3.11M
| ├──26.宿主环境 – 小程序的通信模型.mp4 4.99M
| ├──27.宿主环境 – 运行机制.mp4 5.81M
| ├──28.宿主环境 – 组件 – 了解常用的视图容器组件.mp4 6.87M
| ├──29.宿主环境 – 组件 – view组件的基本使用.mp4 13.94M
| ├──30.宿主环境 – 组件 – scroll-view组件的基本使用.mp4 11.98M
| ├──31.宿主环境 – 组件 – swiper和swiper-item的基本使用.mp4 16.94M
| ├──32.宿主环境 – 组件 – swiper组件的常用属性.mp4 10.54M
| ├──33.宿主环境 – 组件 – text和rich-text组件.mp4 16.46M
| ├──34.宿主环境 – 组件 – button按钮组件.mp4 18.41M
| ├──35.宿主环境 – 组件 – image图片组件.mp4 20.27M
| └──36.宿主环境 – 小程序API的3大分类.mp4 7.56M
├──1-3 微信小程序协同工作和发布
| ├──37.协同工作 – 了解权限管理需求、组织结构、开发流程.mp4 8.86M
| ├──38.协同工作 – 了解小程序成员管理的两个方面.mp4 8.62M
| ├──39.协同工作 – 开发者的权限说明.mp4 5.84M
| ├──40.协同工作 – 了解如何添加项目成员和体验成员.mp4 5.46M
| ├──41.发布 – 了解小程序的版本阶段.mp4 5.22M
| ├──42.发布 – 了解小程序发布上线的主要步骤.mp4 7.88M
| ├──43.发布 – 基于小程序码进行推广.mp4 6.51M
| ├──44.发布 – 查看小程序的运营数据.mp4 8.37M
| └──45.总结.mp4 6.83M
├──1-4 微信小程序基础
| ├──00.学习目标-1603531843.mp4 2.75M
| ├──01.数据绑定 – 了解数据绑定的原则.mp4 7.51M
| ├──02.数据绑定 – 动态绑定属性.mp4 6.75M
| ├──03.数据绑定 – 三元运算.mp4 7.51M
| ├──04.数据绑定 – 算数运算.mp4 6.42M
| ├──05.事件绑定 – 了解什么是事件以及小程序中常用的事件.mp4 6.69M
| ├──06.事件绑定 – 事件对象的属性列表.mp4 8.61M
| ├──07.事件绑定 – target和currentTarget的区别.mp4 6.28M
| ├──08.事件绑定 – bindtap的语法格式.mp4 10.94M
| ├──09.事件绑定 – 在事件处理函数中为data中的数据赋值.mp4 10.75M
| ├──10.事件绑定 – 事件传参.mp4 23.27M
| ├──11.事件绑定 – bindinput的语法格式.mp4 6.90M
| ├──12.事件绑定 – 实现文本框和data之间的数据同步.mp4 15.41M
| ├──13.条件渲染 – if…elif…else.mp4 9.78M
| ├──14.条件渲染 – 基于block标签使用if条件渲染.mp4 10.35M
| ├──15.条件渲染 – hidden.mp4 8.18M
| ├──16.条件渲染 – if和hidden的区别.mp4 14.88M
| ├──17.列表渲染 – for循环的基本用法.mp4 9.44M
| ├──18.列表渲染 – 手动指定索引和当前项的变量名.mp4 7.10M
| └──19.列表渲染 – 指定key值提高渲染效率.mp4 13.63M
├──1-5 微信小程序进阶
| ├──20.wxss – 了解什么是wxss以及它和css之间的关系.mp4 4.34M
| ├──21.wxss – 了解什么是rpx以及它的实现原理.mp4 5.67M
| ├──22.wxss – rpx与px之间的单位换算.mp4 11.38M
| ├──23.wxss – @import样式导入.mp4 9.62M
| ├──24.wxss – 全局样式.mp4 6.79M
| ├──25.wxss – 局部样式.mp4 13.11M
| ├──26.全局配置 – 常用的全局配置项以及小程序窗口的组成部分.mp4 5.99M
| ├──27.全局配置 – window – 设置导航栏的标题.mp4 7.85M
| ├──28.全局配置 – window – 设置导航栏的背景色.mp4 6.72M
| ├──29.全局配置 – window – 设置导航栏的标题颜色.mp4 6.26M
| ├──30.全局配置 – window – 全局开启下拉刷新的功能.mp4 9.85M
| ├──31.全局配置 – window – 关于模拟器的问题说明.mp4 10.71M
| ├──32.全局配置 – window – 设置下拉刷新时的窗口背景色.mp4 5.78M
| ├──33.全局配置 – window – 设置下拉刷新时loading的样式.mp4 6.10M
| ├──34.全局配置 – window – 设置上拉触底的距离.mp4 14.91M
| ├──35.全局配置 – tabBar – 什么是tabBar.mp4 3.39M
| ├──36.全局配置 – tabBar – tabBar的6个组成部分.mp4 5.42M
| ├──37.全局配置 – tabBar – 了解tabBar中的配置项.mp4 16.84M
| ├──38.全局配置 – tabBar – 实现tabBar案例的效果.mp4 39.26M
| ├──39.页面配置 – 了解页面配置和全局配置的关系.mp4 9.50M
| └──40.页面配置 – 页面配置中常用的配置项.mp4 18.31M
├──1-6 微信小程序数据请求和案例
| ├──41.数据请求 – 小程序中网络数据请求的限制.mp4 5.79M
| ├──42.数据请求 – 配置request合法域名.mp4 18.13M
| ├──43.数据请求 – 发起GET请求.mp4 15.26M
| ├──44.数据请求 – 发起POST请求.mp4 12.48M
| ├──45.数据请求 – 了解如何在页面刚加载的时候请求数据.mp4 7.39M
| ├──46.数据请求 – 跳过request合法域名校验.mp4 8.37M
| ├──47.数据请求 – 关于跨域和Ajax的说明.mp4 4.19M
| ├──48.案例 – 创建项目并梳理项目结构.mp4 18.50M
| ├──49.案例 – 配置导航栏效果.mp4 6.30M
| ├──50.案例 – 配置tabBar效果.mp4 13.76M
| ├──51.案例 – 获取轮播图的数据.mp4 18.97M
| ├──52.案例 – 渲染轮播图效果.mp4 16.16M
| ├──53.案例 – 获取九宫格的数据.mp4 11.09M
| ├──54.案例 – 渲染九宫格的布局效果.mp4 31.69M
| ├──55.案例 – 实现首页底部图片的布局效果.mp4 12.97M
| └──56.总结.mp4 8.09M
├──1-7 微信小程序页面导航
| ├──00.学习目标-1603532237.mp4 14.31M
| ├──01.页面导航 – 了解小程序中实现页面导航的两种方式.mp4 2.86M
| ├──02.页面导航 – 声明式导航 – 导航到tabBar页面.mp4 11.30M
| ├──03.页面导航 -声明式导航 – 导航到非tabBar页面.mp4 11.00M
| ├──04.页面导航 – 声明式导航 – 实现后退导航效果.mp4 7.18M
| ├──05.页面导航 – 编程式导航 – 导航到tabBar页面.mp4 9.00M
| ├──06.页面导航 – 编程式导航 – 导航到非tabBar页面.mp4 6.90M
| ├──07.页面导航 – 编程式导航 – 实现后退导航效果.mp4 8.02M
| ├──08.页面导航 – 导航传参 – 声明式导航传参.mp4 9.34M
| ├──09.页面导航 – 导航传参 – 编程式导航传参.mp4 6.66M
| └──10导航传参.mp4 11.10M
├──1-8 微信小程序页面事件和上拉触底案例
| ├──11.页面事件 – 下拉刷新 – 了解什么是下拉刷新.mp4 4.44M
| ├──12.页面事件 – 下拉刷新 – 启用下拉刷新.mp4 5.37M
| ├──13.页面事件 – 下拉刷新 – 配置下拉刷新窗口的样式.mp4 4.76M
| ├──14.页面事件 – 下拉刷新 – 监听页面的下拉刷新事件.mp4 15.56M
| ├──15.页面事件 – 下拉刷新 – 停止下拉刷新的效果.mp4 7.88M
| ├──16.页面事件 – 上拉触底 – 了解什么是上拉触底.mp4 13.08M
| ├──17.页面事件 – 上拉触底 – 监听页面的上拉触底事件.mp4 10.81M
| ├──18.页面事件 – 上拉触底 – 配置上拉触底距离.mp4 5.70M
| ├──19.上拉触底案例 – 案例效果展示.mp4 4.85M
| ├──20.上拉触底案例 – 定义获取随机颜色的方法.mp4 16.87M
| ├──21.上拉触底案例 – 渲染UI结构并美化页面效果.mp4 16.03M
| ├──22.上拉触底案例 – 上拉触底时获取随机颜色.mp4 7.62M
| ├──23.上拉触底案例 – 添加loading提示效果.mp4 13.25M
| ├──24.上拉触底案例 – 介绍为什么需要对上拉触底进行节流处理.mp4 4.29M
| ├──25.上拉触底案例 – 对上拉触底进行节流处理.mp4 14.57M
| └──26.扩展 – 自定义编译模式.mp4 15.56M
├──1-9 微信小程序生命周期和wxs
| ├──27.生命周期 – 什么是生命周期.mp4 2.83M
| ├──28.生命周期 – 小程序中生命周期的两个分类.mp4 3.41M
| ├──29.生命周期 – 什么是生命周期函数.mp4 3.16M
| ├──30.生命周期 – 小程序中生命周期函数的两个分类.mp4 1.89M
| ├──31.生命周期 – 应用的生命周期函数.mp4 21.00M
| ├──32.生命周期 – 页面的生命周期函数.mp4 9.41M
| ├──33.wxs – 了解什么是wxs以及应用场景.mp4 3.04M
| ├──34.wxs – 了解wxs和JavaScript的关系.mp4 6.71M
| ├──35.wxs – 内嵌wxs脚本.mp4 14.75M
| ├──36.wxs – 定义外联的wxs脚本.mp4 6.93M
| ├──37.wxs – 使用外联的wxs脚本.mp4 10.80M
| └──38.wxs – 了解wxs的4个特点.mp4 6.01M
└──资料.zip 282.16M
请先
!