上一篇讲了小程序框架基础,这一篇介绍WXML:小程序版HTML。
常用基础标签text view
特征:
text 类似html span标签 行内元素,不换行;
view 类似html div标签 块级元素,换行;
新建页面
<text>text 类似html span标签 行内元素</text>
<text>,不换行</text>
<view>view 类似html div标签 块级元素</view>
<view>view 类似html div标签 换行</view>
复制代码
测试

公共属性
所有组件都有以下属性:

数据绑定功能使得程序在运行过程中,具备动态改变渲染界面的能力,从而达到了更好的用户体验效果。在
WEB开发中,需要借助JavaScript并通过DOM接口来实现界面的动态更新,而在小程序中,则是使用WXML
语言提供的数据绑定功能来实现的。
复制代码
data: {
id:1, message: 'Hello MINA!',
number:1234,
condition:true,
isChecked:true,
person:{ name:"张三", age:25, sex:"男" }
},
复制代码
<view>{{message}}</view>
<view>{{number}}</view>
<view>{{condition}}</view>
<view>{{isChecked}}</view>
<view>{{person}}</view>
<view>{{person.name}}</view>
<view>{{person.age}}</view>
<view>{{person.sex}}</view> <!-- 自定义属性 data-* -->
<view data-number="{{number}}">自定义属性</view> <!-- 组件属性(需要在双引号之内) -->
<view id="item-{{id}}">组件属性</view> <!-- 控制属性(需要在双引号之内) -->
<view wx:if="{{condition}}">控制属性</view> <!-- 使用布尔类型充当属性 -->
<checkbox checked="{{isChecked}}"></checkbox>
复制代码
测试:

可以在 {{}} 内进行简单的运算,支持的有如下几种方式
如果flag条件是true 则hidden =true 如果flag条件是false 则hidden =false
<view hidden="{{flag?true:false}}">三元运算</view>
复制代码

<view> {{a + b}} + {{c}} + d </view>
复制代码
a: 1,
b: 2,
c: 3
复制代码
当length大于5时展示逻辑判断
<view wx:if="{{length > 5}}">逻辑判断</view>
复制代码

<view>{{"hello " + name}}</view>
复制代码
<view>{{object.key}} {{array[0]}}</view>
复制代码
object: { key: ' 数据路径运算 ' },
array: ['MINA','safsd']
复制代码
在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。(就是说数组有多少条数据,他就会渲染该组件多少次)
userArray:[
{ id:1, name:"张三" },
{ id:2, name:"李四" },
{ id:3, name:"王五" }
]
复制代码
<view wx:for="{{userArray}}" wx:for-item="item" wx:for-index="index"> {{index}}-{{item.id}}-{{item.name}} </view>
复制代码
测试

在框架中,使用 wx:if="" 来判断是否需要渲染该代码块:
<view wx:if="{{condition}}"> True </view>
复制代码
也可以用 wx:elif 和 wx:else 来添加一个 else 块:
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
复制代码
因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使
用一个 标签将多个组件包装起来(这样避免每个组件都要写一遍 wx:if判断条件),并在上边使用 wx:if 控制属性。
<block wx:if="{{true}}">
<view> view1 </view>
<view> view2 </view>
</block>
复制代码
注意: 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。
使用
<view hidden="{{condition}}">hidden</view>
复制代码
他们有什么区别呢?
wx:if 也是惰性的,如果在初始渲染条件为 false ,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。
hidden 就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。
复制代码
他们的使用场景
一般来说, wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。
复制代码
WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。
使用 name 属性,作为模板的名字。然后在 template 内定义代码片段,如:
<!--
index: int
msg: string
time: string
-->
<template name="msgItem">
<view>
<text> {{index}}: {{msg}} </text>
<text> Time: {{time}} </text>
</view>
</template>
复制代码
使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入,如:
<template is="msgItem" data="{{...item}}"/>
复制代码
data: {
item: {
index: 0,
msg: 'this is a template',
time: '2022-10-07'
}
},
复制代码

模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 模块。
WXML 提供两种文件引用方式 import 和 include 。
import 可以在该文件中使用目标文件定义的 template ,如:
在 item.wxml 中定义了一个叫 item 的 template :
<!-- item.wxml -->
<template name="item">
<text>{{text}}</text>
</template>
复制代码
在 importTest.wxml 中引用了 item.wxml,就可以使用 item 模板:
<import src="item.wxml"/>
<view>模板引入</view>
<template is="item" data="{{text: 'forbar'}}"/>
复制代码
import 的作用域
import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件import 的 template。(额,比较绕,就是不能引用引用的引用)
如:C import B,B import A,在C中可以使用B定义的 template ,在B中可以使用A定义的 template ,但是C不能使用A定义的 template 。
include 可以将目标文件除了 template、 wxs 外的整个代码引入,相当于是拷贝到 include
位置,如:
<view>测试include </view>
<!-- index.wxml -->
<include src="header.wxml"/>
<view> body </view>
<include src="footer.wxml"/>
复制代码
<!-- header.wxml -->
<view> header </view>
复制代码
<!-- footer.wxml -->
<view> footer </view>
复制代码

事件是视图层到逻辑层的通讯方式。
事件可以将用户的行为反馈到逻辑层进行处理。
事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
事件对象可以携带额外信息,如 id, dataset, touches。
复制代码
<!--pages/eventTest/eventTest.wxml-->
<text>pages/eventTest/eventTest.wxml</text>
<view id="tapTest" data-hi="Weixin" bindtap="tapName"> 点击事件测试 </view>
复制代码
/**
* 点击事件处理逻辑
* @param {*} event
*/
tapName: function(event) {
console.log(event)
},
复制代码

根据组件触发事件时是否会向父节点传递,将事件分为冒泡事件、非冒泡事件
属性catch 会阻止事件向上冒泡
<view id="outer" bindtap="handleTap1">
outer view
<view id="middle" catchtap="handleTap2">
middle view
<view id="inner" bindtap="handleTap3">
inner view
</view>
</view>
</view>
复制代码
handleTap1: function(event) {
console.log("handleTap1:"+event)
},
handleTap2: function(event) {
console.log("handleTap2:"+event)
},
handleTap3: function(event) {
console.log("handleTap3:"+event)
},
复制代码
测试,点击 inner view 发现控制台打印handleTap3 、handleTap2 说明事件在handleTap2时已经阻止了冒泡传递,因此阻止事件冒泡可以使用catch属性

<input type="text" style="border:1px solid;padding:2px;margin:2px;" bindinput="handleInput" /> <text>文本框的值是:{{num}}</text>
复制代码
handleInput: function(e) {
console.log(e.detail.value);
this.setData({ num:e.detail.value })
},
复制代码
测试输入框内容发生改变时,触发handleInput 事件逻辑,执行num赋值操作。
<view>-实现简单加计算器-</view>
<input type="number" model:value="{{numA}}" class="inputNumber"/>
<button>+</button>
<input type="number" model:value="{{numB}}" class="inputNumber"/>
<button bindtap="handleTap">=</button>
<input type="number" disabled value="{{total}}" class="inputNumber"/>
复制代码
样式文件
/* pages/eventTest/eventTest.wxss */
.inputNumber{
border:1px solid gray;
padding:2px;
margin:1px 20px 1px 20px;
}
复制代码
data: {
numA:'',
numB:'',
total:''
},
/** 处理按钮点击事件
* @param {} e 事件源
**/
handleTap(e){
console.log(e);
console.log(this.data.numA);
console.log(this.data.numB);
this.setData({ total:parseInt(this.data.numA)+parseInt(this.data.numB) })
},
复制代码
进阶,事件传参功能 使用data-*
data-*
自定义属性
组件上触发的事件时,会发送给事件处理
复制代码
按钮修改为data-action="=" ,设置action 参数为 =
<button bindtap="handleTap" data-action="=">=</button>
复制代码
在handleTap 逻辑中获取自定义action参数 ,进行判断
/** 处理按钮点击事件
* @param {} e 事件源
**/
handleTap(e){
let action=e.currentTarget.dataset.action;
console.log("获取自定义参数action :"+action);
console.log(e);
console.log(this.data.numA);
console.log(this.data.numB);
if(action =="="){
this.setData({ total:parseInt(this.data.numA)+parseInt(this.data.numB) })
}else{
console.log("获取自定义参数action获取失败")
}
},
复制代码
至此WXML:小程序版HTML结束
下一篇: WXSS:小程序版CSS
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R