提交PHP组件到Packagist 发布自己的Composer包

 更新时间:2016年11月25日 15:31  点击:1666
下面我们来看一篇关于 提交PHP组件到Packagist 发布自己的Composer包的教程,希望这篇文章能够帮助到各位朋友哦。

Composer是PHP的一个依赖管理工具,它使得PHP焕发新的生机,有了现代化的WEB开发规范,Packagist是PHP组件的库,也有其他的镜像。

在Packagist上提交了一个自己开发的PHP组件,这样其他开发者就可以使用Composer使用这个包了。这个组件并没什么功能,主要是看看提交PHP组件的流程,并记录了过程中遇到的问题及解决方法,以供参考。


提交PHP组件步骤:

1.新建一个项目目录,创建一个composer.json文件,格式如下:

PHP

{
    "name": "your-vendor-name/package-name",
    "description": "A short description of what your package does",
    "require": {
        "php": "^5.3.3 || ^7.0",
        "another-vendor/package": "1.*"
    }
}


这个json格式的文件中包含组件的基本信息,这里还差自动加载的方式,要根据具体开发模式指定自动加载方式,这里require可以指定这个组件依赖的其他组件,composer都会自动解决依赖。

附上完整的composer.json内容作为示例:

JavaScript

{
    "name": "tanteng/laravel-page-loaded-time",
    "description": "Display page loaded time",
    "keywords": ["laravel","performance"],
    "homepage": "https://github.com/tanteng/laravel-page-loaded-time",
    "license": "MIT",
    "authors": [
      {
        "name": "tanteng",
        "email": "tanteng@qq.com",
        "homepage": "http://www.tanteng.me",
        "role": "Developer"
      }
    ],
    "require": {
        "php": "^5.3.3 || ^7.0",
        "laravel/framework": "~4.0"
    },
    "autoload": {
      "psr-4": { "Loading\\": "" }
    }
}

2.开发组件功能

要注意遵循psr规范,使用命名空间。

3.把组件提交到Github上

提交组件到Packagist之前需要先把代码提交到github上,在Packagist只需填写组件的github地址。

4.提交组件地址到Packagist

这样就完成的PHP组件提交到Packagist的过程,具体请参见Packagist官网。

问题:使用composer require找不到组件

组件提交到Packagist上,提示发布成功了,但是使用composer命令却找不到组件:

PHP

composer require tanteng/laravel-page-loaded-time

如图:

composer-not-found

由于我的composer使用的国内镜像,猜测可能是没有同步的原因,使用这个命令把“源”改回去还是不行。

PHP

composer config -g repo.packagist composer https://packagist.org

原来我的组件还没有在github上发布正式,这个时候还是开发版本dev-master.应该加上dev-master版本。

PHP

composer require tanteng/laravel-page-loaded-time:dev-master

果然指定了dev-master版本可以成功更新组件,但是这样不行,我们要有一个正式版本。

composer-dev-master

github发布版本

进入组件的github主页,找到导航上“releases”,点击进去如图页面,就可以创建一个版本,填写好信息之后即可发布版本。

create_release

按照页面上的提示填写内容,完成后发布。发布版本后,通过composer require发现还是找不到包。

设置自动更新版本

auto-update

原来还要在Github上配置一下自动更新。具体步骤参考:https://packagist.org/about#how-to-update-packages

我直接通过手动的方式发送curl请求来设置,这样还简单一点,不过这样每次发新的版本都需要这样请求一下:

PHP

curl -XPOST -H'content-type:application/json' 'https://packagist.org/api/update-package?username=tanteng&apiToken=secret' -d'{"repository":{"url":"https://github.com/tanteng/laravel-page-loaded-time"}}'

返回{“status”:”success”}表示成功。

再打开https://packagist.org/packages/tanteng/laravel-page-loaded-time,发现已经是正式版本了。

我用的是composer国内镜像,因为众所周知的原因,连代码仓库也要被墙,我服!等了几个小时再试,这个时候镜像同步更新了,再次输入:composer require tanteng/laravel-page-loaded-time,这个时候可以成功更新了。如图,vendor文件夹下也自动装载了依赖的其他组件

命名规则其实还是有一点的要求会比较好,否则不统计也难看了,下面整理了一篇关于PHP变量命名规则详解,希望下面的文章对各位有用。

PHP变量命名规则

1、变量以美元符号$开头。如$name,$age。

2、美元符号$后面的第一个字符不可以是数字,只能是下划线_或者字母。如$1_1这样的变量是错误的。

3、除了下划线_外,变量不允许出现任何空格或标点符号。也就是说变量名只能包含:a-z、A-Z、0-9 以及下划线_。

4、PHP变量名是区分大小写的。如$name与$Name是两个不同的变量。

PHP变量命名规则其余注意事项

1、当用两个或两个以上的单词命名变量时,可以将除第一个单词以外的所有单词的首字母大写。如$myName、$yourFamilyName。

2、以下划线_开始命名的变量通常代表特殊的变量。如在类中创建受保护的属性、PHP预定义变量($_GET)、全局数组等。

3、定义变量的时候,不要贪图简短,而应该使用具有描述性的名称定义变量。

学而不思则罔,思而不学则殆。希望您在学习PHP的道路上一帆风顺,并成为PHP编程艺术大师。


以上便是PHP变量命名规则的全部内容。以下是废话,如果您有时间,不妨粗略阅读,也许您能产生共鸣。

PHP变量命名规则

从大学开始到现在,陆陆续续接触过各种编程语言。如客户端语言Javascript,Actionscript;服务器端语言C++,Java,ASP.net,PHP等等,不一而足。在所有这些语言中,我最想学的是PHP。不为别的,就因为PHP的读法:屁H屁,说起来琅琅上口,韵味十足。今天看到PHP变量命名规则这一节,索性就随便写一点东西,聊以打发无聊的光阴。

对PHP的学习,一直时断时续。年轻时候要学好PHP的雄心壮志如今差不多荡然无存了。

有人说,活在这样一个社会里,没有人能一尘不染地活着。这是个怎样的社会?我不太清楚。不过我听人说,这是个聋子听见哑巴说瞎子看见了爱情的扯淡时代。不完全信,但也无法完全不信。

不管怎样,既然活着是不容易的,那么就且活且珍惜吧。

PHP是我想珍惜的。

于是,今天翻了一翻从图书馆借来的新书——PHP动态网页设计(第二版,作者David Powers)。

看到PHP变量命名规则一节。这些非常基础的内容,在时隔数年之后重新温习,倒是真有温故而知新的感觉。

为了使印象更为深刻,也为了实践,好记性不如烂笔头的真理,在这不太安分的夜里,我决定写这篇文章,献给曾经想成为PHP高手的自己。

1、变量以美元符号$开头。如$name,$age;

2、美元符号$后面的第一个字符不可以是数字;

3、除了下划线_外,变量不允许出现任何空格或者标点符号;

4、PHP变量名是区分大小写的。如$name与$Name是两个不同的变量。

其余注意事项

1、当用两个或两个以上的单词命名变量时,可以将除第一个单词以外的所有单词的首字母大写。如$myName;$yourFamilyName;

2、以下划线_开始命名的变量通常留给特殊的情况使用。如在类中创建受保护的属性;PHP预定义变量:全局数组等;

3、定义变量的时候,不要贪图简短,而应该使用具有描述性的名称定义变量。


例子

面是分别用骆驼式命名法和下划线法命名的同一个函数:

printEmployeePaychecks();
print_employee_paychecks();

第一个函数名使用了骆驼式命名法——函数名中的每一个逻辑断点都有一个大写字母来标记;第二个函数名使用了下划线法----函数名中的每一个逻辑断点都有一个下划线来标记。
骆驼式命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得相当多。另一方面,下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。

编辑本段应用概述

骆驼式命名法(Camel-Case)是电脑程式编写时的一套命名规则(惯例)。
骆驼式命名法就是当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
骆驼式命名法(Camel-Case)一词来自 Perl 语言中普遍使用的大小写混合格式,而 Larry Wall 等人所著的畅销书《Programming Perl》(O'Reilly 出版)的封面图片正是一匹骆驼。
骆驼式命名法的命名规则可视为一种惯例,并无绝对与强制,为的是增加识别和可读性。

驼峰法(小驼峰法)

变量一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。譬如
int myStudentCount;
变量myStudentCount第一个单词是全部小写,后面的单词首字母大写。

Pascal法(大驼峰法)

相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。常用于类名,函数名,属性,命名空间。譬如
publicclass DataBaseUser;

PHP 堆与堆排序这种做法小编开发应用中也没用到多少了,这里来给各位整理一篇关于PHP 堆与堆排序文章,希望对各位有用。

堆排序

堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。

1.堆

  堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:

  Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]

  即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。

  堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。

2.堆排序的思想

   利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。

    其基本思想为(大顶堆):

    1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无须区;

    2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n];

    3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

 操作过程如下:

     1)初始化堆:将R[1..n]构造为堆;

     2)将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。

    因此对于堆排序,最重要的两个操作就是构造初始堆和调整堆,其实构造初始堆事实上也是调整堆的过程,只不过构造初始堆是对所有的非叶节点都进行调整。


堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。

PHP 堆管理代码如下:

 代码如下 复制代码

<?php
class heep{
 static function add(&$arr,$one){
  $arr[] = $one;
  self::up($arr,count($arr) -1);
 }
 // 下沉
 static function del(&$arr){
  $arr[0] = array_pop($arr);
  self::down($arr,0,count($arr)-1);
 }
 static function swap(&$arr,$i,$p){
  $tmp = $arr[$i];
  $arr[$i] = $arr[$p];
  $arr[$p] = $tmp;
 }
 // 增加元素 上浮
 static function up(&$arr,$i){
  $p = floor(($i-1)/2);
  while( $p >= 0 && $i > 0 && $arr[$p] > $arr[$i] ){
   self::swap($arr,$i,$p);
   $i = $p;
   $p = floor(($i-1)/2);
  }
 }
 // 下沉 $i开始 $n结束
 static function down(&$arr,$i,$n){
  $l = 2*$i + 1;
  while( $l <= $n ){
   if( $l+1 <= $n && $arr[$l+1]<$arr[$l]) $l ++;
   if( $arr[$l] > $arr[$i] ) break;
   self::swap($arr,$i,$l);
   $i = $l;
   $l = 2*$i + 1;
  }
 }
 // 将数组变成堆
 static function make(&$arr){ 
  $n = count( $arr )-1;
     for ($i = $n / 2 - 1; $i >= 0; $i--) 
         self::down($arr,$i,$n);
 }
 // 将堆进行排序
 static function sort(&$arr){ 
  $n = count( $arr )-1;
     for ( $i=$n; $i >= 0; $i--){
      self::swap($arr,0,$i);
         self::down($arr,0,$i-1);
     }
 }
}

$arr = [10,40,30];
$arr = array();

heep::add($arr,40);
heep::add($arr,10);
heep::add($arr,30);
heep::add($arr,15);
heep::add($arr,8);
heep::add($arr,50);
heep::add($arr,20);
heep::add($arr,3);

echo join(',',$arr),'<br>';

heep::del($arr);
heep::del($arr);
heep::del($arr);
echo join(',',$arr),'<br>';

heep::sort($arr);
echo join(',',$arr),'<br>';

$arr = [40,10,30];
heep::make($arr);
echo join(',',$arr),'<br>';

假设n为当前数组的key则,n的父节点为 n>>1 或者 n/2(整除);n的左子节点l= n<<1 或 l=n*2,n的右子节点r=(n<<1)+1 或 r=l+1

 代码如下 复制代码

$arr=array(1,8,7,2,3,4,6,5,9);
数组$arr的原形态结构如下:
1
/
8 7
/ /
2 3 4 6
/
5 9
heapsort($arr);print_r($arr);
排序后生成标准的小顶堆结构如下:
1
/
2 3
/ /
4 5 6 7
/
8 9
既数组:array(1,2,3,4,5,6,7,8,9):
代码如下:
function heapsort(&$arr)
{
//求最后一个元素位
$last=count($arr);
//堆排序中通常忽略$arr[0]
array_unshift($arr,0);
//最后一个非叶子节点
$i=$last>>1;

//整理成大顶堆,最大的数整到堆顶,并将最大数和堆尾交换,并在之后的计算中忽略数组后端的最大数(last),直到堆顶(last=堆顶)
while(true)
{
adjustnode($i,$last,$arr);
if($i>1)
{
//移动节点指针,遍历所有非叶子节点
$i--;
}
else
{
//临界点last=1,既所有排序完成
if($last==1)break;
//当i为1时表示每一次的堆整理都将得到最大数(堆顶,$arr[1]),重复在根节点调整堆
swap($arr[$last],$arr[1]);
//在数组尾部按大小顺序保留最大数,定义临界点last,以免整理堆时重新打乱数组后面已排序好的元素
$last--;
}
}
//弹出第一个数组元素
array_shift($arr);
}

//整理当前树节点($n),临界点$last之后为已排序好的元素
function adjustnode($n,$last,&$arr)
{
$l=$n<<1; //$n的左孩子位
if(!isset($arr[$l])||$l>$last) return ;
$r=$l+1; //$n的右孩子位

//如果右孩子比左孩子大,则让父节点的右孩子比
if($r<=$last&&$arr[$r]>$arr[$l]) $l=$r;
//如果其中子节点$l比父节点$n大,则与父节点$n交换
if($arr[$l]>$arr[$n])
{
//子节点($l)的值与父节点($n)的值交换
swap($arr[$l],$arr[$n]);
//交换后父节点($n)的值($arr[$n])可能还小于原子节点($l)的子节点的值,所以还需对原子节点($l)的子节点进行调整,用递归实现
adjustnode($l,$last,$arr);
}
}

//交换两个值
function swap(&$a,&$b)
{
$a=$a ^ $b;
$b=$a ^ $b;
$a=$a ^ $b;
}

php static静态属性和静态方法我们以前有介绍过它们的区别在哪里,下面我们来看看关于static静态属性和静态的用法例子。

这里分析了php面向对象中static静态属性和静态方法的调用。关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了。静态属性、方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就有多少个属性)。

实例:

 代码如下 复制代码

<?php
header("content-type:text/html;charset=utf-8");
class Human{
 static public $name = "小妹";
 public $height = 180;
 static public function tell(){
 echo self::$name;//静态方法调用静态属性,使用self关键词
 //echo $this->height;//错。静态方法不能调用非静态属性
//因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象
 }
 public function say(){
 echo self::$name . "我说话了";
 //普通方法调用静态属性,同样使用self关键词
 echo $this->height;
 }
}
$p1 = new Human();
$p1->say();
$p1->tell();//对象可以访问静态方法
echo $p1::$name;//对象访问静态属性。不能这么访问$p1->name
//因为静态属性的内存位置不在对象里
Human::say();//错。say()方法有$this时出错;没有$this时能出结果
//但php5.4以上会提示
?>

静态属性

静态属性也就是说它的值保持其值,比如在类中实例化了N个对象,那么你可以在构造函数中定义一个静态属性来记住对象的个数。类中的静态属性和静态变量差不多,只不过在类中似乎又多了一个些使用上的限制罢了。让我们看看一般的变量吧:

 代码如下 复制代码

1.<?php  
2.function test() {  
3. $n = 1;  
4. echo "The number is:$n<br />";  
5. $n++;  
6.}  
7.test();  
8.test();  
9.test();  
10.test();  
11.test();  
12.test();  
13.?> 

很显然这个函数的结果如下:

The number is:1

The number is:1

The number is:1

The number is:1

The number is:1

The number is:1

但是如果你的程序是这样:

 代码如下 复制代码
1.<?php  
2.function test() {  
3. static $n = 1;  
4. echo "The number is:$n<br />";  
5. $n++;  
6.}  
7.test();  
8.test();  
9.test();  
10.test();  
11.test();  
12.test();  
13.?> 

我们只不过在变量名加了个static关键字而已,结果就大大的不同了:

The number is:1

The number is:2

The number is:3

The number is:4

The number is:5

The number is:6

1.static关键字可以用来修饰变量、方法(静态方法)

2.不经过实例化,就可以直接访问类中static的属性和static的方法。

3.static 的属性和方法,只能访问static的属性和方法,不能访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。

4.在当前类中如果要访问静态成员可以使用self::关键字进行访问。

5.在类中我们不能使用this关键来访问静态属性,因为静态属性在对象可能还没有实例化之前已经存在。

6.在类中静态方法访问静态属性,使用类名::静态属性名即可调用类中的静态属性。

 
静态方法

 代码如下 复制代码
1.<?php  
2.class test {  
3. private static $money = 2000;  
4. public static function getonemon() {  
5.  return test :: $money;  
6. }  
7. public static function gettwomon() {  
8.  self :: $money = self :: $money -1500;  
9.  return self :: $money;  
10. }  
11.}  
12.echo "我现在余额为:";  
13.echo test :: getonemon();  
14.echo "<br>";  
15.echo "消费后,我的余额为:";  
16.echo test :: gettwomon();  
17.?> 

 
在这个示例里我们看到,使用了两种方法来访问静态属性$money的值:一种是前面都提到的类名::属性值的形式,另外一种则是使用了self关键字。当然推荐使用self关键字这种方式,因为如果那天不高兴了,我们修改的类名,那么如果你使用了第一种方式,你是不是还得修改下调用它的方法呢,当然你得在同一个类中,如果你是在子类中想调用父类的静态属性和方法,那就得使用parent::的方式了。

再说一下

1:如果你想在静态方法中调用其它静态方法时,请使用方法是:类名::方法名的形式进行调用,还是那句,如果你在同一个类进行这样的调用,就使用selft关键字进行调用吧。要不然你得的程序可就得报错了。

2:php中静态方法不能调用非静态的属性和非静态方法,也不能使用类名::或者self::调用非静态属性。更不能使用$this->属性名来调用,总之在静态方法中只能调用静态属性或方法,非静态的无法调用。


结论:

(1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;(会提示strict)

[!--infotagslink--]

相关文章

  • Vue组件跨层级获取组件操作

    这篇文章主要介绍了Vue组件跨层级获取组件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-28
  • JS中artdialog弹出框控件之提交表单思路详解

    artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口。本文给大家介绍JS中artdialog弹出框控件之提交表单思路详解,对本文感兴趣的朋友一起学习吧...2016-04-19
  • Vue实现动态查询规则生成组件

    今天我们来给大家介绍下在Vue开发中我们经常会碰到的一种需求场景,本文主要介绍了Vue动态查询规则生成组件,需要的朋友们下面随着小编来一起学习学习吧...2021-05-27
  • js组件SlotMachine实现图片切换效果制作抽奖系统

    这篇文章主要介绍了js组件SlotMachine实现图片切换效果制作抽奖系统的相关资料,需要的朋友可以参考下...2016-04-19
  • vue中使用element日历组件的示例代码

    这篇文章主要介绍了vue中如何使用element的日历组件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-30
  • Vue 过渡(动画)transition组件案例详解

    这篇文章主要介绍了Vue 过渡(动画)transition组件案例详解,非常不错,具有参考借鉴价值,需要的朋友参考下...2017-01-26
  • Vue多选列表组件深入详解

    这篇文章主要介绍了Vue多选列表组件深入详解,这个是vue的基本组件,有需要的同学可以研究下...2021-03-03
  • Vue 组件复用多次自定义参数操作

    这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • vue项目,代码提交至码云,iconfont的用法说明

    这篇文章主要介绍了vue项目,代码提交至码云,iconfont的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
  • Bootstrap进度条组件知识详解

    在网页中,经常见到进度条效果,那么这些个性的进度条组件效果是怎么实现的呢,下面脚本之家小编给大家分享Bootstrap进度条组件知识详解,感兴趣的朋友要求学习吧...2016-05-04
  • angularjs $http实现form表单提交示例

    这篇文章主要介绍了angularjs $http实现form表单提交示例,非常具有实用价值,需要的朋友可以参考下 ...2017-06-15
  • vue递归实现自定义tree组件

    这篇文章主要为大家详细介绍了vue递归实现自定义tree组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-20
  • Vue父子组件传值的一些坑

    这篇文章主要介绍了Vue父子组件传值的一些坑,帮助大家更好的理解和使用vue父子组件,感兴趣的朋友可以了解下...2020-09-16
  • BootStrap 附加导航组件

    Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架,主要基于 HTML、CSS、JAVASCRIPT 的。接下来通过本文给大家介绍BootStrap 附加导航组件的知识,感兴趣的朋友一起学习吧...2016-07-29
  • 使用Angular CDK实现一个Service弹出Toast组件功能

    本文主要写用cdk实现一个简单的Toast组件,使用的是cdk中的overlay模块,需要手动安装环境,具体安装方法及相关实现代码跟随小编一起看看吧...2021-07-28
  • html表单提交中method请求Get和Post区别详解

    在html表单提交中method请求Get和Post区别其实很显示的,get提交会是url形式的并且数据量不能太多,而post数据是在浏览器url看不到的并且可以是大数据量而且get安全性非...2016-09-20
  • Bootstarp创建可折叠的组件

    这篇文章主要为大家详细介绍了Bootstarp创建可折叠组件的对应方法,以实例为大家分享了Bootstrap折叠组件,感兴趣的小伙伴们可以参考一下...2016-02-26
  • C#控制台程序使用Log4net日志组件详解

    这篇文章主要为大家详细介绍了C#控制台程序使用Log4net日志组件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 解析element-ui中upload组件传递文件及其他参数的问题

    这篇文章主要介绍了element-ui中upload组件如何传递文件及其他参数,分析一下我使用element-ui遇到的问题以及解决方法,需要的朋友可以参考下...2021-11-10
  • React 高阶组件HOC用法归纳

    高阶组件就是接受一个组件作为参数并返回一个新组件(功能增强的组件)的函数。这里需要注意高阶组件是一个函数,并不是组件,这一点一定要注意,本文给大家分享React 高阶组件HOC使用小结,一起看看吧...2021-06-13