Stencil

一个轻量化,渐进式编译器,注意,不是框架。

使用 TypeScript 进行所有操作,这是一个门槛,有一定技术门槛要求。

PS:个人强烈推荐所有的前端同学都学习,或至少了解这个超集语言。

生命周期

  • componentWillLoad
  • componentDidLoad
  • componentWillUpdate
  • componentDidUpdate
  • componentDidUnload

几乎所有框架都有的,这里精简到 5 个,不再做过多赘述。

需要注意的是生命周期在父子组件的传递顺序,这个是常规理解顺序(a 套着 b,b 套着 c):

  1. cmp-a - componentWillLoad()
  2. cmp-b - componentWillLoad()
  3. cmp-c - componentWillLoad()
  4. cmp-c - componentDidLoad()
  5. cmp-b - componentDidLoad()
  6. cmp-a - componentDidLoad()

装饰器

  • Component
  • Prop
  • Watch
  • State
  • Method
  • Element

Component

与 Angular 类似,用来装饰当前类为组件类,并且可以提前声明相关元数据。

@Component({
tag: 'todo-list', // 标签名
styleUrl: 'todo-list.scss', // 样式链接,可使用 styleUrls 来插入数组
host: { // 当前组件配置
theme: 'todo', // class
role: 'list' // 参数
}
})

使用:

<todo-list class='todo' role='list'></todo-list>

Prop

声明传入参数,可以通过元数据 @Prop({ mutable: true })@Prop({ reflectToAttr: true }) 使其可变动与反射到绑定源上。

@Prop() prop1: any
@Prop() prop1: number = 1 // 设置默认值
@Prop({ mutable: true }) prop2: any // 可变动
@Prop({ reflectToAttr: true }) prop3: any // 反射

使用注意:html 文件中使用要使用 a-b 连字符,组件中使用 aB 驼峰标识。

Watch

常规的观察装饰器,可以用来监听某个 Prop 的变化,用法:

@Watch('prop1')
watchHandler(newValue: any, oldValue: any) {
// todo...
}

State

内部状态,跟 React 的 State 一个意思,不过更新不用使用 setState ,直接修改即可。

@State() state1: number = 1

Method

函数装饰器,用来说明这是个函数:

@Method()
method1() {
// todo...
}

Element

比较稀奇的装饰器,可以用来获取当前组件的 DOM 实例,进行常规 DOM 操作,当前,内部声明的也已经绑定到实例上了,如下:

@Element() ele: HTMLElement

使用:

this.todoListEl.classList.add('active')

事件

两个相关装饰器:Event,EventEmitter,事件与事件发射器。

Event

发射:

import { Event, EventEmitter } from '@stencil/core';

export class TodoList {

  @Event() todoCompleted: EventEmitter;

  todoCompletedHandler(todo: Todo) {
this.todoCompleted.emit(todo);
}
}

监听:

import { Listen } from '@stencil/core';

export class TodoApp {

  @Listen('todoCompleted')
todoCompletedHandler(event: CustomEvent) {
console.log('Received the custom todoCompleted event: ', event.detail);
}
}

监听原生

@Listen('body:scroll')
handleScroll(ev) {
console.log('the body was scrolled', ev);
} @Listen('keydown')
handleKeyDown(ev){
if(ev.keyCode === 40){
console.log('down arrow pressed')
}
} @Listen('keydown.up')
handleUpArrow(ev){
console.log('will fire when up arrow is pressed');
}

目前支持的按键:

  • enter
  • escape
  • space
  • tab
  • left
  • up
  • right
  • down

不支持的考虑使用 keyCode 处理。

JSX 监听

这个牛逼了……还是上面那个 todoList,然后不用 @Listen,直接在组件上 on 即可:

<todo-list onTodoCompleted={ev => this.someMethod(ev)}></todo-list>

我下巴都掉了……N 久不用 React 了,这么先进?


数据响应

有点尴尬,也有点强势。

不支持监听数组(对象一样)本身变动,意思说:

改动数组本身,不会引起响应,比如 pop、push 啦,统战思想就是,换新数组。

let arr = [1, 2, 3]
arr.push(4) // 不响应
arr = [...arr, 4] // 响应

明白了?虽然觉得挺奇怪,但是好在简单,不用去记哪些能引起,哪些不能引起……


JSX

熟悉的同学可以跳过。

事件绑定两种方式

render() {
return (
<button onClick={ (event: UIEvent) => this.handleClick(event)}>Click Me!</button>
);
}
render() {
return (
<button onClick={this.handleClick.bind(this)}>Click Me!</button>
)
}

插入 html 代码

<div innerHTML={svgContent}></div>

ref

<input type="text" ref={(el: HTMLInputElement) => this.textInput = el} />


样式

  1. Shadow DOM
  2. 样式变量

Shadow DOM

这玩意是一组 API,功能大体是用来封装 Web Component 到局部,类似 Vue 等的 scoped 功能。

Stencil 默认不使用 Shadow DOM,开启如下:

@Component({
tag: 'shadow-component',
styleUrl: 'shadow-component.scss',
shadow: true
})
export class ShadowComponent { }

就是 Component 装饰器一个 shadow 的元数据。

此时获取组件内的 DOM 实例则使用:this.el.shadowRoot.querySelector()

之前使用的 css 文件声明:

my-element {
div {
background: blue;
}
}

可以改为:

:host {
div {
background: blue;
}
}

样式变量

在根路径下的 stencil.config.js 文件内配置:globalStyle: 'path/to/variables.css,内容类似下方:

:root {
--app-primary-color: #488aff;
}

注意 :root 声明,然后其他组件使用如下:

h1 {
color: var(--app-primary-color)
}

配置插件

css 预编译器需要声明插件才能使用,比如 sass、less、stylus 以及 postcss。

stencil.config.ts

import { less } from '@stencil/less'

exports.config = {
plugins: [
less()
]
}

全局引入

stencil.config.ts

globalScript: 'src/global/app.ts'


实例 Demo:npm init stencil 选择 ionic 即可。

Stencil 基础的更多相关文章

  1. OpenGL基础图形编程

    一.OpenGL与3D图形世界1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个充 ...

  2. 【转】OpenGL基础图形编程(一)

    原文:http://blog.chinaunix.net/uid-20638550-id-1909183.html  分类: 一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 ...

  3. Unity5.6之前版本VRTK插件基础交互

    一.VR运行环境配置: 安装steam,在steam上安装SteamVR驱动. 在Unity项目中需要导入VRTool插件包(已上传服务器),里面包含两个插件一个是SteamVR插件,一个是VRTK插 ...

  4. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础

    第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...

  5. stage3D基础三------什么是AGAL(转)

    原文链接 http://www.adobe.com/cn/devnet/flashplayer/articles/hello-triangle.html 在本文中,你将研究一个能够正常运行的基于Sta ...

  6. ShaderLab中vertex fragment类Shader基础格式笔记

    //U3D用的shader语言叫ShaderLab,基础语法官方文档地址 //https://docs.unity3d.com/Manual/SL-Shader.html //开头指明名字,可以在别的 ...

  7. ZBrush软件特性之Stencil模板调控板

    在ZBrush中使用Stencil模板我们了解的所有绘图工具,通过它确定模板周围与涂画或模型的位置.本文将详解ZBrush®中如何使用“曲线板”自定义形状. 使用模版 ZBrush模版的作用象我们了解 ...

  8. [译]Vulkan教程(15)图形管道基础之RenderPass

    [译]Vulkan教程(15)图形管道基础之RenderPass Render passes Setup 设置 Before we can finish creating the pipeline, ...

  9. [译]Vulkan教程(14)图形管道基础之固定功能

    [译]Vulkan教程(14)图形管道基础之固定功能 Fixed functions 固定功能 The older graphics APIs provided default state for m ...

随机推荐

  1. python第十九天——感冒中

    ConfigParser模块,hashlib模块,hmac模块: 创建配置文件: import configparser config = configparser.ConfigParser()#创建 ...

  2. webAPi OData的使用

    一.OData介绍 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. 二.OData 在asp.net mvc中的用法 ...

  3. CRM项目之stark组件(2)

    那么从今天开始呢,我们就要开始设计属于我们自己的admin组件,起个名字就叫stark吧(当然你愿意叫什么都可以). stark组件之四步走 仿照admin组件实现流程,stark组件要实现四件事情: ...

  4. 前端性能优化成神之路—资源合并与压缩减少HTTP请求

    资源合并与压缩减少HTTP请求的概要 资源合并与压缩减少HTTP请求主要的两个优化点是减少HTTP请求的数量和减少请求资源的大小 http协议是无状态的应用层协议,意味着每次http请求都需要建立通信 ...

  5. MyCat读写分离、分库分表

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

  6. Spark DataSet 、DataFrame 一些使用示例

    以前使用过DS和DF,最近使用Spark ML跑实验,再次用到简单复习一下. //案例数据 1,2,3 4,5,6 7,8,9 10,11,12 13,14,15 1,2,3 4,5,6 7,8,9 ...

  7. ucml JS调用其它页面上的服务端方法

    var params = { _bpoName: "BPO_KH_ED" + "Service", //BPO的名字(拥有那个服务端函数的BPO) _metho ...

  8. Signature Request Warnings & eth_sign学习

    https://consensys.zendesk.com/hc/en-us/articles/360004427792-Signature-Request-Warnings-eth-sign Met ...

  9. day04流程控制之while

    while语法: while 条件:  缩进的循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件. # 如果条件为假,那么循环体不执行,循环终止 示例一: "&qu ...

  10. Drool实战系列(一)之入门程序

    Drools官网地址为:https://www.drools.org/ maven环境 入门程序例子如下: 项目结构截图: 一.导入pom文件 <project xmlns="http ...