extJS--尚

ExtJS依赖JavaScript,JavaScript推荐两本书:《JavaScript高级程序设计》初阶阶段, 《JavaScript设计模式》中级阶段

 

fun1();//会调用fun1()方法 因为:function语句定义的形式,JavaScript解析器直接去找,先执行完成function定义的方法,其余代码从上到下按照顺序执行

function fun1() // 先 执行 function定义的方法
{
	
}

var fun2 = function( x ) 
{
	return x;
}

var fun3 = new Function('x','y','return x+y');
alert( fun3(20,30) );//显示 50

=========== arguments ================
function test( x,y,z )
{
	alert( arguments.length);//返回 3(有两个参数)
	alert( arguments[2]);//显示 3(第2个参数)
}
test(1,2,3);

==============================

 

  

 

给Eclipse安装Spket的插件:

 

eclipse编写ExtJS有提示功能需要:sdk.jsb3文件:该文件在解压目录 build目录下:

==========================================

 

========================================================================================================

需要导入的extjs的文件:

=======================================================================================

/**
 * Ext.onReady 必须的准备函数 类似于 window.onload,但是加载时机跟靠前
 */
 Ext.onReady(function(){
 	// Ext 在这个方法里写
 	Ext.MessageBox.alert('提示信息','hello world');
 });

  

===================== Ext 的文档查看方式  ===============

-------------------------------------------------------------------------------------------

================================= window 组件 ====================================================

Ext.window.Window

configs:
constrain:布尔值,true为限制窗口只能在其容器内移动,默认值为false,允许窗口在任何位置移动。(另:constrianHeader属性)
modal:布尔值,true为设置模态窗口。默认为false
plain:布尔值,true为窗口设置透明背景。false则为正常背景,默认为false
x、y :设置窗口左上角坐标位置。
onEsc:复写onEsc函数,默认情况下按Esc键会关闭窗口。
closeAction:string值,默认值为'destroy',可以设置'hide'关闭时隐藏窗口
autoScroll:布尔值,是否需要滚动条,默认false 

html:String值

icon:String值(图片路径)

iconCls:String值(CSS的样式)

例如:

Ext.onReady(function(){

	//Ext.create方法相当于创建一个实例对象
	Ext.create('Ext.window.Window',{
		title:'我的第一个组件,window' ,
		width:400 , 	//Number型  也可以是字符串类型  width: '90%'
		height:300 ,
		layout:'fit' ,
		constrain:true ,		//限制窗口不超出浏览器边界
		modal:true ,			//设置一个模态窗口
		//plain:true ,
		icon:'js/extjs/icons/used/browser_window.png',				//字符串参数,图片的路径
		//iconCls:'' ,   		//CSS样式
		x:50 ,
		y:50 ,
		autoScroll:true,		//添加滚动条
		html:'<div style=width:200px;height:200px>我是一个div</div><div style=width:200px;height:200px>我是第二个div</div>' ,
		//constrainHeader:true,	//不允许该窗口的title超出浏览器边界
		renderTo:Ext.getBody()	//新创建的组件 渲染到什么位置
	}).show();
	
});

  

 点击一个按钮 ,打开一个新的窗体 window重复创建的问题

Ext.onReady(function(){

	//ex001:点击一个按钮 ,打开一个新的窗体 window重复创建的问题
	//第一种实现
	//JQuery code: var btn = $('#btn'); var dombtn = btn.get(0);
	var btn = Ext.get('btn');		//这个元素是经过Ext包装的一个Ext的Dom对象//alert(btn.dom.value);
	btn.on('click',function(){
		if(!Ext.getCmp('mywin')){
			Ext.create('Ext.window.Window',{
				id:'mywin' ,		//如果你给组件加了一个id  那么这个组件就会被Ext所管理
				title:'新窗体' , 
				height:300 ,
				width:400 ,
				renderTo:Ext.getBody() //,
				//modal:true 使窗口模态窗口
			}).show();		
		}
	});
	
	//第二种实现
//	var win = Ext.create('Ext.window.Window',{
//				title:'新窗体' , 
//				height:300 ,
//				width:400 ,
//				renderTo:Ext.getBody() ,
//				closeAction:'hide'  //closeAction默认是destroy 
//	});
//	
//	Ext.get('btn').on('click',function(){
//			win.show();
//	});
	
});

  

在组件中添加子组件  ,并进行一系列针对于组件的操作

Ext.onReady(function(){

	
	//ex002 : 在组件中添加子组件  ,并进行一系列针对于组件的操作
	
	//在组件中添加子组件:
//	var win = new Ext.window.Window({
//		title:"添加子组件实例" , 
//		width:'40%' ,
//		height:400 , 
//		renderTo:Ext.getBody() ,
//		draggable:false , 	//不允许拖拽
//		resizable:false , 	//不允许改变窗口大小
//		closable:false, 	//不显示关闭按钮
//		collapsible:true ,	//显示折叠按钮
//		bodyStyle: 'background:#ffc; padding:10px;' , // 设置样式
//		html:'我是window的内容!!' ,
//		//Ext items(array) 配置子组件的配置项
//		items:[{
//			//Ext的组件 给我们提供了一个简单的写法	 xtype属性去创建组件
//			xtype:'panel',
//			width:'50%',
//			height:100 ,
//			html:'我是面板'
//		},
//		new Ext.button.Button({
//			text:'我是按钮' , 
//			handler:function(){
//				alert('执行!!');
//			}
//		})
		{
			xtype:'button' , 
			text:'我是按钮',
			handler:function(btn){
				alert('我被点击了');
				alert(btn.text);
			}
		}
//		]
//		
//	});
//	win.show();	
	
	var win = new Ext.Window({
		id:'mywin' ,
		title:'操作组件的形式' ,
		width:500 , 
		height:300 , 
		renderTo:Ext.getBody() , 
		//表示在当前组件的top位置添加一个工具条
		tbar:[{			//bbar(bottom) lbar(leftbar)  rbar(rightbar)  fbar(footbar)
			text:'按钮1' ,
			handler:function(btn){
				//组件都会有 up、down 这两个方法(表示向上、或者向下查找) 需要的参数是组件的xtype或者是选择器
				alert(btn.up('window').title);
			}
		},{
			text:'按钮2' , 
			handler:function(btn){
				//最常用的方式
				alert(Ext.getCmp('mywin').title);
			}
		},{
			text:'按钮3' ,
			handler:function(btn){
				//以上一级组件的形式去查找 OwnerCt
				//console.info(btn.ownerCt);
				alert(btn.ownerCt.ownerCt.title);
			}			
		}]		
	});
	win.show();

});

  

 用windowGroup(Ext.ZidexManager)对象去操作多个window窗口

Ext.onReady(function(){

	
	//ex003:用windowGroup对象去操作多个window窗口
	var wingroup = new Ext.WindowGroup();
	for(var i = 1 ; i <=5;i++){
		var win = Ext.create('Ext.Window',{
			title:'第' + i + '个窗口' , 
			id:'win_' + i , 
			width:300 , 
			height:300 ,
			renderTo:Ext.getBody()
		});
		win.show();
		wingroup.register(win);		//把窗体对象注册给ZindexManger
	}
	
	var btn1 = Ext.create('Ext.button.Button',{
		text:'全部隐藏' , 
		renderTo:Ext.getBody(),
		handler:function(){
			wingroup.hideAll();		//隐藏所有被管理起来的window组件
		}
	});
	
	var btn2 = new Ext.button.Button({
		text:'全部显示' , 
		renderTo:Ext.getBody(),
		handler:function(){
			wingroup.each(function(cmp){
				cmp.show();
			});
		}		
	});
	
	var btn3 = new Ext.button.Button({
		text:'把第三个窗口显示在最前端' , 
		renderTo:Ext.getBody(),
		handler:function(){
			wingroup.bringToFront('win_3'); //把当前的组件显示到最前端
		}		
	});	
	
	
	var btn4 = new Ext.button.Button({
		text:'把第五个窗口显示在最末端' , 
		renderTo:Ext.getBody(),
		handler:function(){
			wingroup.sendToBack('win_5');	//把当前的组件显示到最后
		}		
	});		
	
	
});

  

config、constructor

Ext.onReady(function(){
	
	//第12讲:config、constructor
	/*
	//在Ext中如何去定义一个类: Ext.define(className , properties , callback)
	Ext.define('Person',{
		//这里是对于这个类的一些配置信息
		//config属性 就是配置当前类的属性内容,并且会加上get和set方法
		config:{
			name:'z3' , 
			age: 20
		},
		//自己定义的方法
		say:function(){
			alert('我是方法...');
		},
		//给当前定义的类加一个构造器 ,目的就是为了初始化信息
		constructor:function(config){
			var me = this ;
//			for(var attr in config){
//				alert(attr + " : " + config[attr]);
//			}
			me.initConfig(config);	// 真正的初始化传递进来的参数
		}
	});
	
	//Ext.create 实例化一个对象
	var p = Ext.create('Person',{
		name:'王五' , 
		age:30
	});
	alert(p.getName());
	alert(p.getAge());
	p.say();
	*/
	
	
	
	//第13讲:extend 
	
	//Ext的继承代码
	/**
	//Sup Class
	Ext.define('Person',{
		config:{
			name:'bjsxt'
		} ,
		constructor:function(config){
			var me = this ;
			me.initConfig(config);
		}
	});
	//Sub Class
	Ext.define('Boy',{
		//使用Ext的继承
		extend:'Person',
		config:{
			sex:'男',
			age:20
		}
	});
	var b = Ext.create('Boy',{
		name:'张三',
		age:25
	});
	alert(b.name);
	alert(b.sex);
	alert(b.age);
	
	*/
	
	
	//javascript : prototype(原型)  :所有类的实例对象所共享
	/**
	 
	function Person(name){
		this.name = name; 
		//this.sayName = sayName ;
	};
//	function sayName(){
//		alert(this.name);
//	};
	Person.prototype.sayName = function(){
		alert(this.name);
	};
	
	var p1  = new Person('张三');
	p1.sayName();
	var p2  = new Person('李四');
	p2.sayName();	
	alert(p1.sayName == p2.sayName);
 
	*/




	//javascript : prototype(原型)  :实现继承
	/**
	
	//SupClass
	var Person = function(name){
		this.name = name; 
	};
	//alert(Person.prototype.constructor);		//原型对象的构造器,默认是当前的类的模板
	//SupClass prototype object
	Person.prototype = {
		constructor:Person ,
		id:100
	};
	
	//SubClass
	var Boy = function(name,sex,age){
		//借用构造函数继承的方式
		Person.call(this,name);
		this.sex = sex ;
		this.age = age ;
	};
	
	//实现原型继承: 继承了父类的模板和父类的原型对象
	//Boy.prototype = new Person();
	//自己实现extend的方法
	function myextend(sub , sup){
	        var F = function() {},		//定义一个空函数做为中转函数
	            subclassProto,			//子类的原型对象
	            superclassProto = sup.prototype;	//把父类的原型对象 交给了superclassProto变量
	
	        F.prototype = superclassProto;	// 做中转的位置:把父类的原型对象 赋值给了 F这个空函数的原型对象
	        subclassProto = sub.prototype = new F();	//进行原型继承
	        subclassProto.constructor = sub;		//还原构造器
	        sub.superclass = superclassProto;		//做了一个保存,保存了父类的原型对象
			//目的是为了防止你大意了
	        if (superclassProto.constructor === Object.prototype.constructor) {
	            superclassProto.constructor = sup;
	        }	
	};
	myextend(Boy ,Person);
	var b = new Boy('李四','男',25);
	alert(b.name);
	alert(b.sex);
	alert(b.id);
	
	*/
	
	
	//第14讲:Ext.define 其他配置项
	
	
	//别名、备用名
	/**
	Ext.define("User",{
		config:{
			name:'bjsxt111' , 
			age:100
		},
		alias:'uu' ,//起别名	底层代码在Ext.ClassManger
		alternateClassName:'uuu',	//给当前类一个备用名 底层代码在Ext.ClassManger
		constructor:function(config){
			var me = this;
			me.initConfig(config);
		}
	});
	 
	var u = Ext.create('uuu');
	alert(u.name);
	alert(u.age);
	*/
	
	
	//statics(子类不能继承) inheritableStatics(子类可以继承) 给当前类定义静态方法或属性
	
	/**
	Ext.define('Person',{
		config:{
			name:'我是父类'
		},
		statics:{	//静态的方法或属性
			static_id:'我是Person的id,不能被子类所继承!!'
		},
		inheritableStatics:{	//静态的方法或属性
			inheritableStatics_id:'我是Person的id,我可以被子类继承!!'
		},
		constructor:function(config){
			var me = this;
			me.initConfig(config);
		}
	});
	
	//一定注意:!!!!!//实例对象是无法使用静态属性或方法的
	//var p = Ext.create('Person');
	//alert(p.static_id);	
	//用类名去使用静态属性:!!!!
//	alert(Person.static_id);
//	alert(Person.inheritableStatics_id);
	
	Ext.define('User',{
		extend:'Person' , 
		config:{
			age:20
		}
	});
	alert(User.static_id);
	alert(User.inheritableStatics_id);
	
	*/
	
	//mixins 混合的配置项,可以多继承的配置
	
	/**
	Ext.define("Sing",{
		canSing:function(){
			alert('cansing...');
		}
	});
	Ext.define("Say",{
		canSay:function(){
			alert('cansay...');
		}
	});	
	Ext.define('User',{
		mixins:{
			sing:"Sing" , 
			say:"Say"
		}
	});
	
	var u = Ext.create("User");
	u.canSay();
	u.canSing();
	*/
	
	
	
	//^_^伪代码说明: requires 和 uses 以及  singleton
	/**
	Ext.define('MyComponent',{
		//可能需要Ext或者是其他的类做支持
		//requires加载需要的类时机是:当前类初始化之前被加载
		//requires:['Ext.window.Window','Ext.button.Button'] 
		//uses加载需要的类时机是:当前类初始化之后被加载
		//uses:['Ext.form.Panel','Ext.grid.Panel']
		//singleton:true	//当前的类就被当做一个单例对象
	});
	*/

});

  

Ext.apply & Ext.applyIf

Ext.onReady(function(){

	//Ext.js
	
	//Ext.apply & Ext.applyIf
	
	/**
	//Ext.apply就是为对象扩展属性或方法的
	var src = {name:'张三',age:20};	//源对象
	var config = {name:'李四',sex:'男'};		//配置对象
	//Ext.apply(src , config);
	Ext.applyIf(src,config);		//如果当前对象存在属性,我就不进行copy 如果不存在则copy
	// name : '李四'  age : 20  sex:'男'
	for(var attr in src){
		alert(attr + " : " + src[attr]);
	}
	*/
	
	/**
	 * 
	//Ext.extend
	//Ext.typeOf 和原生的javascript typeof
//	var str = '111';
//	var num = 20;
//	alert(Ext.typeOf(str));
//	alert(Ext.typeOf(num));
//	Ext.isArray()
//	var arr = [1,2,3,4];
//	Ext.iterate(arr,function(item){
//		alert(item);
//	});
	
	//Ext.override
//	Ext.define('User',{
//		say:function(){
//			alert('say....');
//		}		
//	});
//	var user = Ext.create('User');
//	Ext.override(user,{
//		say:function(){
//			alert('我是覆盖后的say方法..');
//		}
//	});
//	user.say();

	 */

	//Ext-more.js
	
});

  

如何创建一个Ext的类,创建类的复杂流程

定义类的方法:define

对于Ext4.X版本来说,采用了新定义类的define方法,而不是延续旧版本的extend方法,那么对于定义一个新的类。具体研究define的使用

Ext.define( classname,properties,callback);

---classname:要定义的新类的类名

---properties:新类的配置对象(Ext文档中 Class的配置项configs)

---callback:回调函数,当类创建完后执行该函数。

注解:对于Ext定义一个新的类。那么我们可以想象到。既然是利用Ext.define去创建类。那么创建的类一定是Ext所特有的类,不同于传统的JavaScript创建一个类,也就是我们要对define方法的第二个参数properties配置项进行配置,需要找到Ext对于类的支持的API进行配置

==========================================================

Configs配置项说明:

extends用于继承
alias类的别名
alternateClassName备用名,与alias差不多
requires需要使用到的类名数组,在动态加载时会根据该属性去下载类,注意需要的类是在当前类之前被加载
uses与requires类似,但是被引用的类可以在该类之后才加载
constructor构造器属性,一般用来初始化类的配置和调用其父类的方法
mixins混入属性,多继承
config定义类的配置项,会吧config里的每一个属性加上get和set方法
statics定义静态方法,属性不能被子类继承
inheritableStatics与statics类似,但是其属性可被子类继承
singleton设置该类为单件模式

-----------------------------------------------------

 config、constructor

Ext.onReady(function(){
	
	//第12讲:config、constructor
	/*
	//在Ext中如何去定义一个类: Ext.define(className , properties , callback)
	Ext.define('Person',{
		//这里是对于这个类的一些配置信息
		//config属性 就是配置当前类的属性内容,并且会加上get和set方法
		config:{
			name:'z3' , 
			age: 20
		},
		//自己定义的方法
		say:function(){
			alert('我是方法...');
		},
		//给当前定义的类加一个构造器 ,目的就是为了初始化信息
		constructor:function(config){
			var me = this ;
//			for(var attr in config){
//				alert(attr + " : " + config[attr]);
//			}
			me.initConfig(config);	// 真正的初始化传递进来的参数
		}
	});
	
	//Ext.create 实例化一个对象
	var p = Ext.create('Person',{
		name:'王五' , 
		age:30
	});
	alert(p.getName());
	alert(p.getAge());
	p.say();
	*/
}

 

extend

Ext.onReady()
{
	//extend 
	
	//Ext的继承代码
	/**
	//Sup Class
	Ext.define('Person',{
		config:{
			name:'bjsxt'
		} ,
		constructor:function(config){
			var me = this ;
			me.initConfig(config);
		}
	});
	//Sub Class
	Ext.define('Boy',{
		//使用Ext的继承
		extend:'Person',
		config:{
			sex:'男',
			age:20
		}
	});
	var b = Ext.create('Boy',{
		name:'张三',
		age:25
	});
	alert(b.name);
	alert(b.sex);
	alert(b.age);
	
	*/
	
	
	//javascript : prototype(原型)  :所有类的实例对象所共享
	/**
	 
	function Person(name){
		this.name = name; 
		//this.sayName = sayName ;
	};
//	function sayName(){
//		alert(this.name);
//	};
	Person.prototype.sayName = function(){
		alert(this.name);
	};
	
	var p1  = new Person('张三');
	p1.sayName();
	var p2  = new Person('李四');
	p2.sayName();	
	alert(p1.sayName == p2.sayName);
 
	*/


	//javascript : prototype(原型)  :实现继承
	/**
	
	//SupClass
	var Person = function(name){
		this.name = name; 
	};
	//alert(Person.prototype.constructor);		//原型对象的构造器,默认是当前的类的模板
	//SupClass prototype object
	Person.prototype = {
		constructor:Person ,
		id:100
	};
	
	//SubClass
	var Boy = function(name,sex,age){
		//借用构造函数继承的方式
		Person.call(this,name);
		this.sex = sex ;
		this.age = age ;
	};
	
	//实现原型继承: 继承了父类的模板和父类的原型对象
	//Boy.prototype = new Person();
	//自己实现extend的方法
	function myextend(sub , sup){
	        var F = function() {},		//定义一个空函数做为中转函数
	            subclassProto,			//子类的原型对象
	            superclassProto = sup.prototype;	//把父类的原型对象 交给了superclassProto变量
	
	        F.prototype = superclassProto;	// 做中转的位置:把父类的原型对象 赋值给了 F这个空函数的原型对象
	        subclassProto = sub.prototype = new F();	//进行原型继承
	        subclassProto.constructor = sub;		//还原构造器
	        sub.superclass = superclassProto;		//做了一个保存,保存了父类的原型对象
			//目的是为了防止你大意了
	        if (superclassProto.constructor === Object.prototype.constructor) {
	            superclassProto.constructor = sup;
	        }	
	};
	myextend(Boy ,Person);
	var b = new Boy('李四','男',25);
	alert(b.name);
	alert(b.sex);
	alert(b.id);
	
	*/
}

 

alias别名、alternateClassName备用名

Ext.onReady()
{
	//Ext.define 其他配置项
	
	//别名、备用名
	/**
	Ext.define("User",{
		config:{
			name:'bjsxt111' , 
			age:100
		},
		alias:'uu' ,//起别名	底层代码在Ext.ClassManger
		alternateClassName:'uuu',	//给当前类一个备用名 底层代码在Ext.ClassManger
		constructor:function(config){
			var me = this;
			me.initConfig(config);
		}
	});
	 
	var u = Ext.create('uuu');
	alert(u.name);
	alert(u.age);
	*/
}

 

 statics(子类不能继承) inheritableStatics(子类可以继承) 给当前类定义静态方法或属性

 

Ext.onReady()
{
	
	//statics(子类不能继承) inheritableStatics(子类可以继承) 给当前类定义静态方法或属性
	
	/**
	Ext.define('Person',{
		config:{
			name:'我是父类'
		},
		statics:{	//静态的方法或属性
			static_id:'我是Person的id,不能被子类所继承!!'
		},
		inheritableStatics:{	//静态的方法或属性
			inheritableStatics_id:'我是Person的id,我可以被子类继承!!'
		},
		constructor:function(config){
			var me = this;
			me.initConfig(config);
		}
	});
	
	//一定注意:!!!!!//实例对象是无法使用静态属性或方法的
	//var p = Ext.create('Person');
	//alert(p.static_id);	
	//用类名去使用静态属性:!!!!
//	alert(Person.static_id);
//	alert(Person.inheritableStatics_id);
	
	Ext.define('User',{
		extend:'Person' , 
		config:{
			age:20
		}
	});
	alert(User.static_id);
	alert(User.inheritableStatics_id);
	
	*/
	
}

 

mixins 混合的配置项,可以多继承的配置

Ext.onReady()
{
	//mixins 混合的配置项,可以多继承的配置
	
	/**
	Ext.define("Sing",{
		canSing:function(){
			alert('cansing...');
		}
	});
	Ext.define("Say",{
		canSay:function(){
			alert('cansay...');
		}
	});	
	Ext.define('User',{
		mixins:{
			sing:"Sing" , 
			say:"Say"
		}
	});
	
	var u = Ext.create("User");
	u.canSay();
	u.canSing();
	*/
}

 

伪代码说明: requires 和 uses 以及  singleton

Ext.onReady()
{
	//^_^伪代码说明: requires 和 uses 以及  singleton
	/**
	Ext.define('MyComponent',{
		//可能需要Ext或者是其他的类做支持
		//requires加载需要的类时机是:当前类初始化之前被加载
		//requires:['Ext.window.Window','Ext.button.Button'] 
		//uses加载需要的类时机是:当前类初始化之后被加载
		//uses:['Ext.form.Panel','Ext.grid.Panel']
		//singleton:true	//当前的类就被当做一个单例对象
	});
	*/
}

 

 

Ext.js和Ext-more.js的深入解析。

Ext对原生JavaScript类的扩展

Ext操作DOM

Ext开始响应事件

认识Ext.js和Ext-more.js , 这两个文件包含了Ext的一些基础定义,基本的属性和方法

Ext.onReady(function(){

	//Ext.js
	
	//Ext.apply & Ext.applyIf
	
	/**
	//Ext.apply就是为对象扩展属性或方法的
	var src = {name:'张三',age:20};	//源对象
	var config = {name:'李四',sex:'男'};		//配置对象
	//Ext.apply(src , config);
	Ext.applyIf(src,config);		//如果当前对象存在属性,我就不进行copy 如果不存在则copy
	// name : '李四'  age : 20  sex:'男'
	for(var attr in src){
		alert(attr + " : " + src[attr]);
	}
	*/
	
	/**
	 * 
	//Ext.extend
	//Ext.typeOf 和原生的javascript typeof
//	var str = '111';
//	var num = 20;
//	alert(Ext.typeOf(str));
//	alert(Ext.typeOf(num));
//	Ext.isArray()
//	var arr = [1,2,3,4];
//	Ext.iterate(arr,function(item){
//		alert(item);
//	});
	
	//Ext.override
//	Ext.define('User',{
//		say:function(){
//			alert('say....');
//		}		
//	});
//	var user = Ext.create('User');
//	Ext.override(user,{
//		say:function(){
//			alert('我是覆盖后的say方法..');
//		}
//	});
//	user.say();

	 */

	//Ext-more.js
	
});

 

posted on 2018-05-12 18:58 樊聪 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/fancongcong/p/9029544.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值