Stencil 基础
Stencil
一个轻量化,渐进式编译器,注意,不是框架。
使用 TypeScript 进行所有操作,这是一个门槛,有一定技术门槛要求。
PS:个人强烈推荐所有的前端同学都学习,或至少了解这个超集语言。
生命周期
- componentWillLoad
- componentDidLoad
- componentWillUpdate
- componentDidUpdate
- componentDidUnload
几乎所有框架都有的,这里精简到 5 个,不再做过多赘述。
需要注意的是生命周期在父子组件的传递顺序,这个是常规理解顺序(a 套着 b,b 套着 c):
- cmp-a - componentWillLoad()
- cmp-b - componentWillLoad()
- cmp-c - componentWillLoad()
- cmp-c - componentDidLoad()
- cmp-b - componentDidLoad()
- 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} />
样式
- Shadow DOM
- 样式变量
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 基础的更多相关文章
- OpenGL基础图形编程
一.OpenGL与3D图形世界1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个充 ...
- 【转】OpenGL基础图形编程(一)
原文:http://blog.chinaunix.net/uid-20638550-id-1909183.html 分类: 一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 ...
- Unity5.6之前版本VRTK插件基础交互
一.VR运行环境配置: 安装steam,在steam上安装SteamVR驱动. 在Unity项目中需要导入VRTool插件包(已上传服务器),里面包含两个插件一个是SteamVR插件,一个是VRTK插 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础
第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...
- stage3D基础三------什么是AGAL(转)
原文链接 http://www.adobe.com/cn/devnet/flashplayer/articles/hello-triangle.html 在本文中,你将研究一个能够正常运行的基于Sta ...
- ShaderLab中vertex fragment类Shader基础格式笔记
//U3D用的shader语言叫ShaderLab,基础语法官方文档地址 //https://docs.unity3d.com/Manual/SL-Shader.html //开头指明名字,可以在别的 ...
- ZBrush软件特性之Stencil模板调控板
在ZBrush中使用Stencil模板我们了解的所有绘图工具,通过它确定模板周围与涂画或模型的位置.本文将详解ZBrush®中如何使用“曲线板”自定义形状. 使用模版 ZBrush模版的作用象我们了解 ...
- [译]Vulkan教程(15)图形管道基础之RenderPass
[译]Vulkan教程(15)图形管道基础之RenderPass Render passes Setup 设置 Before we can finish creating the pipeline, ...
- [译]Vulkan教程(14)图形管道基础之固定功能
[译]Vulkan教程(14)图形管道基础之固定功能 Fixed functions 固定功能 The older graphics APIs provided default state for m ...
随机推荐
- 平板电脑安装Ubuntu教程
平板电脑安装Ubuntu教程-以V975w为例,Z3735系列CPU通用 最近尝试在昂达V975w平板电脑和intel stick中安装ubuntu,经过分析,发现存在一个非常大的坑.但因为这个坑,此 ...
- [20171128]rman Input or output Memory Buffers.txt
[20171128]rman Input or output Memory Buffers.txt --//做一个简单测试rman 的Input or output Memory Buffers. 1 ...
- [20170909]为什么是12秒.txt
[20170909]为什么是12秒.txt --//在开发程序时我一般会强调开发尽量不要写一些自定义函数,往往可能导致CPU忙.--//例子很像这样: CREATE OR REPLACE FUNCTI ...
- SQL去除空格、截取数据的方法:trim、substring
1.如device表中的identity字段正常的字段长度是32位,但是某些不正常的数据,后面多出空格,需要去掉后面的空格,可执行以下命令: ; ; 2.使用substring函数截取某字段的的其中一 ...
- V4L2 driver -整体架构
我的uvc开源地址:gitee-uvc 字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间. V4L2 驱动核心:主要是构建一个内核中标准视频设备驱动的框架 ...
- 解决windows 挂载 nfs 驱动器中 中文乱码问题
乱码问题,是由于 mount.nfs 命令不支持 utf-8字符集.所以是系统软件支持的问题.在网络上找了很多方案都没能解决. 网上主要有三种方案(1)换解决方案,使用smb 共享,这等于不是解决方法 ...
- 代理ARP--善意的欺骗
1. 代理ARP(Proxy ARP)是什么? 顾名思义,它指通过中间设备(通常为Router)代替其他主机响应ARP请求.对于没有配置默认网关的主机想要与其他网络的另一台主机通信时,网关收到源主机的 ...
- cc1plus.exe: error: unrecognized command line option "-fno-keep-inline-dllexport "
在Windows环境下的控制台上,通过qmake指令编译Qt程序时,出现 cc1plus.exe: error: unrecognized command line option "-fno ...
- 12LaTeX学习系列之---LaTex的图片插入
目录 目录 前言 (一)插图的基本语法 (二)插入的基本设置 1.说明: 2.源代码: 3.输出效果 (三)查看文档 目录 本系列是有关LaTeX的学习系列,共计19篇,本章节是第12篇. 前一篇:1 ...
- MySQL内连接(INNER JOIN)
MySQL INNER JOIN子句介绍 MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录. INNER JOIN子句是SELECT语句的可 ...