1. v-for="item in items" 返回数组元素
<div id="app">
<div v-for="item in items">{{item.firstName}}</div>
<script>
var arr=new Vue({
el:"#app",
data:{
items:[
{firstName:"zheng"},
{firstName:"wang"}
</script>
var arr=new Vue({
el:"#app",
data:{
items:[
{firstName:"zheng"},
{firstName:"wang"}
]
}
})
固定语法:v-for="item in items",items是源数据数组并且 item 是数组元素迭代的别名。
网页效果:渲染的结果是 firstName 这个数组的元素
2. v-for="(item, index) in items" 返回数组元素和索引值
<div id="app">
<div v-for="(item,index) in items">{{index}}-{{item.firstName}}</div>
<script>
var arr=new Vue({
el:"#app",
data:{
items:[
{firstName:"zheng"},
{firstName:"wang"}
</script>
网页效果:可通过 {
{index}} 获取当前元素索引值
二、 v-for 和对象
1. 返回
值
v-for="value in object"
2. 返回
键、值
v-for="(value, key) in object"
3.返回
键、值、索引
v-for="(value, key, index) in object"
<div id="div" >
<p v-for="(value, key, index) in object">
{{ index }}. {{ key }}: {{ value }}
<script>
var ling=new Vue({
el:'#div',
data: {
object: {
firstName: 'zheng',
lastName: 'zeling',
age: 26
</script>
<div id="div" >
<p
v-for="(value, key, index) in object"
>
{
{ index }}. {
{ key }}: {
{ value }}
</p>
</div>
var ling=new Vue({
el:'#div',
data: {
object: {
firstName: 'zheng',
lastName: 'zeling',
age: 26
}
}
})
渲染效果:
这篇文章写的是 v-for 用于数组和对象的用法。 一、v-for 和数组1. v-for="item in items" 返回数组元素&lt;div id="app"&gt;&lt;div v-for="item in items"&gt;{{item.firstName}}&lt;/div&gt;&lt;/div&gt;&lt;script&
•八大数据类型的包装类分别为:Byte、Short、Integer、Long、Character、 Float、Double、Boolean。
把基本数据类型变量包装类实例是通过对应包装类的构造器来实现的,不仅如此,8个包装类中除了
Character之外,还可以通过传入一个字符串参数来构建包装类
对象
。
•在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属
于类成员,类Field既可通过类来访问,也可以通过类的
对象
来访问。当通过
对象
来访问类属性时,系统会在底
层转换为通过该类来访问类 属性。
类成员规则
–1.我们把该类的构造器使用Private修饰,从而把该 类的所有构造器隐藏起来。
–2.则需要提供一个public方法作为该类的访问点,用于创建该类的
对象
,且必须使用static修饰
–3.该类还必须缓存已经创建的
对象
,必须用static修饰
final变量
• 抽象类不能被实例化,可以通过其子类给他赋
值
,普通类里有的抽象里也有,定义抽象方法只需在普通方法上增
加abstract修饰符,并把普通方法的方法体(也就是方法后花括号括起来的部分)全部去掉,并在方法后增加分号
抽象类的特征
•和类定义不同,定义接口不再用class关
键
字,而是使用interface关
键
字。语法如下:
•[修饰符] interface接口名 extends 父接口1,父接口2 ...
• 零个到多个常量定义...
• 零个到多个抽象方法定义...
• 零个到多个内部类、接口、枚举定义...
• 零个到多个默认方法或类方法定义...
•当在非静态内部类的方法内访问某个变量时,系统优先在该方法内查找是否存在该名字的局部变量,如果存在该
名字的局部变量,就使用该变量,如果不存在,则到该方法所在的内部类中查找是否存在该名字的属性,如果存在
则使用该属性。
•总之,第一步先找局部变量,第二步,内部类的属性,第三步。外部类的属性。
本文原创作者:pipi-changing
本文原创出处:http://www.cnblogs.com/pipi-changing/
–在外部类以外的地方使用内部类,内部类完整的类名应该OuterClass.InnerClass.
–在外部类以外的地方使用非静态内部类创建
对象
的语法如下:OuterInstance.new InnerConstructor()
–在外部类以外的地方使用静态内部类创建
对象
的语法如下:new OuterClass.InnerConstructer();
局部内部类
•如果把一个内部类放在方法里定义,这就是局部内部类,仅仅在这个方法里有效。
•局部内部类不能在外部类以外的地方使用,那么局部内部类也不能使用访问控制符和static修饰
匿名内部类
•匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下:
•new 父类构造器(实例列表) |实现接口)
• //匿名内部类的 类体部分
•匿名内部类不能是抽象类,匿名内部类不能定义构造器。
Lambda表达式入门
•Lambda表达式主要作用就是代替匿名内部类的繁琐语法。它由三部分组成:
–形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
–箭头(->),必须通过英文等号和大于符号组成。
–代码块。如果代码块只有包含一条语句,Lambda表达式允许省略代码块的花括号,如果省略了代码块的花括
号,这条语句不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关
键
字。
Lambda表达式需要
返回
值
,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动
返回
这条语句的
Lambda表达式与函数式接口
•如果采用匿名内部类语法来创建函数式接口的实例,只要实现一个抽象方法即可,在这种情况下即可采用
Lambda表达式来创建
对象
,该表达式创建出来的
对象
的目标类型就是这个函数式接口。
•Lambda表达式有如下两个限制:
–Lambda表达式的目标类型必须是明确的函数式接口。
–Lambda表达式只能为函数式接口创建
对象
。Lambda表达式只能实现一个方法,因此它只能为只有一个抽
象方法的接口(函数式接口)创建
对象
。
•为了保证Lambda表达式的目标类型是一个明确的函数式接口,可以有如下三种常见方式:
–将Lambda表达式赋
值
给函数式接口类型的变量。
–将Lambda表达式作为函数式接口类型的参数传给某个方法。
–使用函数式接口对Lambda表达式进行强制类型转换。
方法引用与构造器引用
•J2SE1.5新增了一个enum关
键
字,用以定义枚举类。正如前面看到,枚举类是一种特殊的类,它一样可以有自
己的方法和属性,可以实现一个或者多个接口,也可以定义自己的构造器。一个Java源文件中最多只能定义一个
public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。
•去活状态:如果程序中某个
对象
不再有任何引用变量引用它,它就进入了去活状态。在这个状态下,系统的垃圾
回收机制准备回收该
对象
所占用的内存,在回收该
对象
之前,系统会调用所有去活状态
对象
的finalize方法进行资
源清理,如果系统在调用finalize方法重新让一个引用变量引用该
对象
,则这个
对象
会再次变为激活状态;否则该
对象
将进入死亡状态。
•死亡状态:当
对象
与所有引用变量的关联都被切断,且系统会调用所有
对象
的finalize方法依然没有使该
对象
变成
激活状态,那这个
对象
将永久性地失去引用,最后变成死亡状态。只有当一个
对象
处于死亡状态时,系统才会真正
回收该
对象
所占有的资源。
强制垃圾回收
–永远不要主动调用某个
对象
的finalize方法,该方法应交给垃圾回收机制调用。
–finalize方法的何时被调用,是否被调用具有不确定性。不要把finalize方法当成一定会被执行的方法。
–当JVM执行去活
对象
的finalize方法时,可能使该
对象
,或系统中其他
对象
重新变成激活状态。
–当JVM执行finalize方法时出现了异常,垃圾回收机制不会报告异常,程序继续执行。
对象
的软、弱和虚引用
public class AddCommand implements Command {
public void process(int[] target) {
int sum = 0;
for (int tmp : target) {
sum += tmp;
System.out.println("
数组元素
的总和是:" + sum);
****************************************************
public class BetterPrinter implements Output {
private String[] printData = new String[MAX_CACHE_LINE * 2];
// 用以记录当前需打印的作业数
private int dataNum = 0;
public void out() {
// 只要还有作业,继续打印
while (dataNum > 0) {
System.out.println("高速打印机正在打印:" + printData[0]);
// 把作业队列整体前移一位,并将剩下的作业数减1
System.arraycopy(printData, 1, printData, 0, --dataNum);
public void getData(String msg) {
if (dataNum >= MAX_CACHE_LINE * 2) {
System.out.println("输出队列已满,添加失败");
} else {
// 把打印数据添加到队列里,已保存数据的数量加1。
printData[dataNum++] = msg;
************************************************
public interface Command {
// 接口里定义的process()方法用于封装“处理行为”
void process(int[] target);
**********************************************
public class CommandTest {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int[] target = { 3, -4, 6, 4 };
// 第一次处理
数组
,具体处理行为取决于PrintCommand
pa.process(target, new PrintCommand());
System.out.println("------------------");
// 第二次处理
数组
,具体处理行为取决于AddCommand
pa.process(target, new AddCommand());
*************************************************
public class Computer {
private Output out;
public Computer(Output out) {
this.out = out;
// 定义一个模拟
获取
字符串输入的方法
public void keyIn(String msg) {
out.getData(msg);
// 定义一个模拟打印的方法
public void print() {
out.out();
**********************************************
interface interfaceA {
int PROP_A = 5;
void testA();
interface interfaceB {
int PROP_B = 6;
void testB();
interface interfaceC extends interfaceA, interfaceB {
int PROP_C = 7;
void testC();
public class InterfaceExtendsTest {
public static void main(String[] args) {
System.out.println(interfaceC.PROP_A);
System.out.println(interfaceC.PROP_B);
System.out.println(interfaceC.PROP_C);
**************************************************
public interface Output
// 接口里定义的成员变量只能是常量
int MAX_CACHE_LINE = 50;
// 接口里定义的普通方法只能是public的抽象方法
void out();
void getData(String msg);
// 在接口中定义默认方法,需要使用default修饰
default void print(String... msgs)
for (String msg : msgs)
System.out.println(msg);
// 在接口中定义默认方法,需要使用default修饰
default void test()
System.out.println("默认的test()方法");
// 在接口中定义类方法,需要使用static修饰
static String staticTest()
return "接口里的类方法";
**********************************************
public class OutputFactory {
public Output getOutput() {
// return new Printer();
return new BetterPrinter();
public static void main(String[] args) {
OutputFactory of = new OutputFactory();
Computer c = new Computer(of.getOutput());
c.keyIn("轻量级Java EE企业应用实战");
c.keyIn("疯狂Java讲义");
c.print();
***********************************************
public class OutputFieldTest {
public static void main(String[] args) {
// 访问另一个包中的Output接口的MAX_CACHE_LINE
System.out.println(lee.Output.MAX_CACHE_LINE);
// 下面语句将引起"为final变量赋
值
"的编译异常
// lee.Output.MAX_CACHE_LINE = 20;
// 使用接口来调用类方法
System.out.println(lee.Output.staticTest());
************************************************
public class PrintCommand implements Command {
public void process(int[] target) {
for (int tmp : target) {
System.out.println("迭代输出目标
数组
的
元素
:" + tmp);
***********************************************
// 定义一个Product接口
interface Product {
int getProduceTime();
// 让Printer类实现Output和Product接口
public class Printer implements Output, Product {
private String[] printData = new String[MAX_CACHE_LINE];
// 用以记录当前需打印的作业数
private int dataNum = 0;
public void out() {
// 只要还有作业,继续打印
while (dataNum > 0) {
System.out.println("打印机打印:" + printData[0]);
// 把作业队列整体前移一位,并将剩下的作业数减1
System.arraycopy(printData, 1, printData, 0, --dataNum);
public void getData(String msg) {
if (dataNum >= MAX_CACHE_LINE) {
System.out.println("输出队列已满,添加失败");
} else {
// 把打印数据添加到队列里,已保存数据的数量加1。
printData[dataNum++] = msg;
public int getProduceTime() {
return 45;
public static void main(String[] args) {
// 创建一个Printer
对象
,当成Output使用
Output o = new Printer();
o.getData("轻量级Java EE企业应用实战");
o.getData("疯狂Java讲义");
o.out();
o.getData("疯狂Android讲义");
o.getData("疯狂Ajax讲义");
o.out();
// 调用Output接口中定义的默认方法
o.print("孙悟空", "猪八戒", "白骨精");
o.test();
// 创建一个Printer
对象
,当成Product使用
Product p = new Printer();
System.out.println(p.getProduceTime());
// 所有接口类型的引用变量都可直接赋给Object类型的变量
Object obj = p;
*************************************************
public class ProcessArray {
public void process(int[] target, Command cmd) {
cmd.process(target);
。。。。。。。。。。。。。。。。
关
键
在于 v-for 的嵌套中,下一层嵌套中的 in 的
对象
,需要是外层嵌套中遍历的
对象
比如,此处,内层的 itemList 就是在 item 中进行遍历的,而 item 恰是外层嵌套的
对象
item
嵌套循环中,内层循环用 itemList in listL.list 是不行的
JSON 数据
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
func: "Clear Cookies",
info: "Cookies will be clear. When deleted, most sites will be signed out.",
event: "clearCookies"
func: "Clear Search History",
info: "Search history that was manually entered and accessed from the browse
普通的form表单校验
日常业务开发中,对于中后台管理系统,form表单校验是一个很常见的问题。
查阅Element官方文档,我们了解到,form表单校验是这样的,需要给所校验的el-form-item添加prop属性
值
,这个属性
值
便就是当前
元素
v-model 所绑定的
值
。如图所示:
v-for 循坏的表单校验
那么问题来了,通过v-for 遍历循环渲染的form表单怎么添加校验呢?主要问题就在...
Minrff:
h5 获取地理位置 navigator.geolocation.getCurrentPosition(success, error, options)
-小子-:
vue v-model 双向绑定表单元素的数据:实质是绑定了value、checked、selected属性
Aerial_MJ:
JS 中构造函数和普通函数的区别