# layui_binder
**Repository Path**: lxwzsh123/layui_binder
## Basic Information
- **Project Name**: layui_binder
- **Description**: 不影响layui使用的前提下,使用响应式数据和模板解析。
1.以layui组件的方式引入
2.声明式渲染
3.条件渲染和循环渲染
4.事件绑定与双向绑定
5.组件化应用构建
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 7
- **Created**: 2024-08-13
- **Last Updated**: 2024-08-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Layui-binder: 一个layui框架的视图管理模块
## 警告: 仅供测试与交流, 请勿在项目正式环境中使用
## 特征
#### 1、很轻量
> Layui-binder 整个框架只依赖 layui,再无其他任何第三方依赖。
#### 2、只增强
> Layui-binder 支持模版语法、数据绑定,但不丢失 layui 原有的任何功能。
#### 3、高复用
> Layui-binder 支持组件,可以将常用的部分(html,js)封装成组件,多个地方调用。
#### 4、更灵动
> Layui-binder 支持自定义指令语法,可以根据需要编写不同需求。
#### 5、不完善
> Layui-binder 没有过多的完善,在实际使用中会有这样或那样的问题(资源释放和事件管理是两大难题),希望能得到完善。
## 开始
- 示例 1:[layuiGenerator(根据数据库构建项目)](https://gitee.com/giteetcj/layuiGenerator.git)
- 示例 2:[智能bi项目](https://gitee.com/giteetcj/yupi_search.git)
## hello world(原生)
**第 1 步:编写 html 模版**
```html
{{msg}}
```
**第 2 步:创建视图对象**
示例1:使用new关键字创建
```javascript
var view = new layui.binder({
el: "#app",
data: {
msg: "hello world",
}
});
```
示例2:无new关键字创建
```javascript
var view = layui.binder({
el: "#app",
data: {
msg: "hello world",
}
});
```
> 以上两种方式等效,效果都是div里面的文字被替换成 “hello world”
示例3:修改数据
```javascript
view.$data.msg = 'hello layui';
```
> 在上面的基础上修改view对象里面数据的值,对应页面上面的值也会被修改。
## Layui-binder 属性
### el -> 渲染的目的地 (除了声明组件,都应该是必填项)
```html
{{msg}}
```
> el 代表这个视图对象需要渲染在那个dom上面,一般传入string类型的选择器或者是一个dom对象
### template -> 渲染的模板字符串(组件必填,其它的选填)
```javascript
var view = layui.binder({
el: "#app",
template: `
`,
data: {
msg: "hello world",
}
});
```
> template 代表这个视图对象需要以此作为渲染的模板,需要注意的是最外层只能有一个标签
### data -> 视图数据(建议每个都必填)
```javascript
var view = layui.binder({
el: "#app",
data: {
msg: "hello world",
tags: ['layui', 'component','javascript'],
num: 19,
detail: {
name: "Layui-binder",
version: "4.x",
}
}
});
```
> data 是整个视图的重点,建议都加上这一项配置,空对象也行;另外也可以声明成返回一个对象的函数
### computeds -> 计算属性
```javascript
var view = layui.binder({
el: "#app",
data: {
a: 10,
b: 15
},
computeds: {
res(){
return this.a + this.b;
}
}
});
```
> computeds 计算属性会在初始化和计算信息发生改变时进行计算,视图取值是直接取到的结果;可以合理使用计算属性避免不必要的多次计算
### methods -> 内置私有方法
```javascript
var view = layui.binder({
el: "#app",
data: {},
methods: {
speak(){
return 'hello layui';
}
}
});
```
> methods 创建方法之后可以在视图对象找到它,直接以this.XXX()调用;需要注意的是,方法同名可能被覆盖
- 内置公共方法
```javascript
layui.binder.Method("speak", function(){
return 'hello layui';
});
```
> 使用Method可以创建公共方法,一次创建后面的所有视图对象都可以使用这个方法了;需要注意的是,私有方法优先于公共方法,可以声明私有方法来重写同名的公共方法
### diretives -> 自定义指令(略)
### watchs -> 监视属性
```javascript
var view = layui.binder({
el: "#app",
data: {
msg: "hello layui"
},
watchs: {
msg(value){
console.log(value);
}
}
});
```
> watchs 监视属性 用于监视某个视图数据的变化,在变化时会将变化的值传入这个回调当中
- 非属性创建
```javascript
view.$watch("msg", function(value){
console.log(value);
});
```
> 使用$watch方法可以去掉必须在属性中声明的限制,可以使用这个方式在任意地方添加监视属性
- 完整参数
```javascript
view.$watch("msg", {
immediate: false,
deep: false,
handler(value) {
console.log(value);
},
});
```
> 这种方式才是完整版的
- immediate -> 是否创建时立即执行回调,默认false
- deep -> 是否深监听,默认false
- handler -> 定义回调函数
> 需要注意的是,对于同一属性,监听事件可以是多次绑定的
### components -> 定义声明组件
示例1:创建并使用组件
```html
```
```javascript
var view = layui.binder({
el: "#app",
components:{
mylayui: {
name: 'mylayui',
data: function(){
return {};
},
template: `
这是一个自定义组件模板
`
}
}
});
```
> 这样上面的特殊标签就会被替换成组件模板里面的内容了
示例2:定义并使用全局组件
```javascript
layui.binder.extend({
name: 'mylayui',
data: function(){
return {};
},
template: `
这是一个自定义组件模板
`
});
var view = layui.binder({
el: "#app",
components:{
mylayui: 'mylayui'
}
});
```
> 可以使用extend方法将组件声明成全局组件,这样各处调用时只需要用name名称替代,比较方便
示例3:父子对象传值
```javascript
layui.binder.extend({
name: 'mylayui',
data: function(dataSource){
return {
msg: dataSource.msg
};
},
template: `
这是一个自定义组件模板: {{msg}}
`
});
var view = layui.binder({
el: "#app",
components:{
mylayui: ['mylayui',{dataSource: {msg: "hello layui"}}]
}
});
```
> 在组件使用的时候可以传递数组,第二个参数可以自定义组件的属性,达到父对子传值的效果
示例4:父子对象调用
```javascript
layui.binder.extend({
name: 'mylayui',
data: function(dataSource){
return {
msg: dataSource.msg
};
},
methods: {
invokeSuper(){
return this.spuer.speak();
}
}
template: `
这是一个自定义组件模板: {{msg}}
`
});
var view = layui.binder({
el: "#app",
methods: {
speak(){
return this.mylayui.$data.msg;
}
}
components:{
mylayui: ['mylayui',{dataSource: {msg: "hello layui"}}]
}
});
```
- 在父对象中,可以使用 .$children[index] 或者直接 .组件名称 来指向组件对象
- 在组件对象中,可以使用this.super来指向父对象
> 最后注意,为了保持组件之间的数据隔离,data声明必须使用函数式声明
## Layui-binder 生命周期
### beforeCreate 数据初始化创建之前的回调函数
```javascript
var baseData = {
'张三': '85',
'李四': '96',
}
var view = layui.binder({
el: "#app",
data: baseData,
beforeCreate(){
let arr = [];
for(key in baseData){
arr.push(baseData[key])
}
baseData = arr;
},
});
```
> beforeCreate 在数据被初始化之前被调用
### created 数据初始化创建之后的回调函数(略)
### beforeDestroy 视图对象“销毁”之前的回调函数,一般用来释放一些资源
### destroyed 视图对象“销毁”之后的回调函数(略)
### beforeMount 视图对象渲染之前的回调函数,此时模板还未被词法解析(略)
### mounted 视图对象渲染之后的回调函数,此时视图对象已就绪
```javascript
var view = layui.binder({
el: "#app",
data: {},
mounted(){
console.log('layui ready');
},
});
```
> 一般在mounted回调函数中执行接下来的业务
## Layui-binder 语法
> laytpl中大多数场合是以d来作为数据源的别称,在这里以变量b来作为视图对象的别称,在部分场合可能会用到
## Layui-binder 文本语法
> 这种一般出现在标签文本居多
### 1.以双花括号包围起来的赋值语法
> 双花括号包围起来的内容视为:在视图对象中取出同名的数据或计算属性,将它们的值赋值在那个地方。一般用在dom的文本里面居多
- 文本赋值
```html
{{msg}}
```
> 上面代表会从视图对象中查找msg这个名字的变量,将它的值赋值给这个div的文本中
- 带拼接的赋值
```html
消息:{{msg}}
```
> 视图对象仅改变赋值语法的部分,其它部分还是原样,不会被修改
## Layui-binder 属性语法
> 这种都是将标签属性进行加工得到的
### 1.以:打头的属性会被解释成动态属性
- 动态属性
```html
```
> 上面的:lay-filter最后会成为 lay-filter属性,其属性值是视图对象的msg这个变量的值
- 动态拼接属性
> 上面的写法是 :lay-filter = "{{msg}}"的简写,这个也是一个赋值语法,所以它也是可以拼接的
```html
```
- 特殊属性的合并
> 上面的属性,加了:的属性和原属性会冲突,但是style和class这两个属性是可以合并成多个的
```html
```
> 上面的第一个class值layui-form会被保留下来
- 复杂写法
```html
```
> 在属性上面也可以写一个三目表达式
### 2.以@打头的属性会被解释成需要绑定某个事件
```html
```
> 这里代表给这个div绑定一个click点击事件,在点击时调用视图对象里面的speak方法
### 3.以v-打头的属性会被解释成调用某个指令
#### v-if 条件渲染(实际使用不佳)
```html
```
> 当点击试index值增加时,index = 2时这个div才被展示出来
#### v-model 表单元素双向绑定(实际使用不佳)
> 后面扩展出vform,在这里面对这个方面进行继续扩展
#### v-each 循环渲染(实际使用不佳)
```html
{{entry}}
```
> 指定遍历一个数组,mark属性是遍历的信息在子元素里面别称。需要注意的是子元素最外层只能有一个标签
### 4.以*打头的属性会被解释成创建or更新一个数据
```html
```
> 代表程序执行到这里,需要在视图对象上面添加一个名字叫index值为1的变量