vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能。本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统。

每一个新技术的诞生,都是为了解决特定的问题。组件的出现就是为了解决页面布局等等一系列问题。vue中的组件分为两种,全局组件和局部组件。

一、全局组件的注册

通过Vue.component()创建一个全局组件之后,我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--第二步,使用-->
  11. <global_component></global_component>
  12. </div>
  13. <script>
  14. // 第一步,注册
  15. Vue.component("global_component", {
  16. template: `
  17. <div>
  18. <h2>Hello Vue</h2>
  19. </div>
  20. `
  21. });
  22. new Vue({
  23. el: "#app",
  24. });
  25. </script>
  26. </body>
  27. </html>

组件的参数

因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 datacomputedwatchmethods 以及生命周期钩子等。仅有的例外是像 el这样根实例特有的选项。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--第二步,使用-->
  11. <global_component></global_component>
  12. </div>
  13. <script>
  14. // 第一步,注册
  15. Vue.component("global_component", {
  16. data: function () {
  17. return {
  18. count: 0
  19. }
  20. },
  21. template: `<button v-on:click="count++">You clicked me {{ count }} times.</button>`
  22. });
  23. new Vue({
  24. el: "#app",
  25. });
  26. </script>
  27. </body>
  28. </html>

组件的复用

每个实例维护自己的一份独立的数据。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--第二步,使用-->
  11. <global_component></global_component>
  12. <global_component></global_component>
  13. <global_component></global_component>
  14. </div>
  15. <script>
  16. // 第一步,注册
  17. Vue.component("global_component", {
  18. data: function () {
  19. return {
  20. count: 0
  21. }
  22. },
  23. template: `<button v-on:click="count++">You clicked me {{ count }} times.</button>`
  24. });
  25. new Vue({
  26. el: "#app",
  27. });
  28. </script>
  29. </body>
  30. </html>

注意当点击按钮时,每个组件都会各自独立维护它的 count。因为你每用一次组件,就会有一个它的新实例被创建。

Data必须是一个函数

data必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝, 也可以写成如下形式

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!--第二步,使用-->
  11. <global_component></global_component>
  12. <global_component></global_component>
  13. <global_component></global_component>
  14. </div>
  15. <script>
  16. // 第一步,注册
  17. Vue.component("global_component", {
  18. data(){
  19. return {
  20. count: 0
  21. }
  22. },
  23. template: `<button v-on:click="count++">You clicked me {{ count }} times.</button>`
  24. });
  25. new Vue({
  26. el: "#app",
  27. });
  28. </script>
  29. </body>
  30. </html>

二、局部组件的注册

全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

全局组件始终是存在的,除非程序结束,如果组件越来越大,那么程序所占用的空间和消耗的性能就会更大。

局部组件的第一种使用方式

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="component-demo">
  10. <!--最后在根元素当中使用它-->
  11. <!--第一种使用方式,会把当前div渲染进DOM-->
  12. <my-header></my-header>
  13. </div>
  14. <script>
  15. // 定义一个局部组件,其实就是一个变量,它是一个object类型
  16. // 属性与全局组件是一样的
  17. let Header = {
  18. template: `
  19. <button @click="count++">{{ count }}</button>
  20. `,
  21. data() {
  22. return {
  23. count: 0
  24. }
  25. }
  26. };
  27. new Vue({
  28. el: "#component-demo",
  29. // 第二部,需要在根实例当中使用它
  30. components: {
  31. 'my-header': Header
  32. }
  33. });
  34. </script>
  35. </body>
  36. </html>

局部组件的第二种使用方式

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="component-demo">
  10. </div>
  11. <script>
  12. // 定义一个局部组件,其实就是一个变量,它是一个object类型
  13. // 属性与全局组件是一样的
  14. let Header = {
  15. template: `
  16. <button @click="count++">{{ count }}</button>
  17. `,
  18. data() {
  19. return {
  20. count: 0
  21. }
  22. }
  23. };
  24. new Vue({
  25. el: "#component-demo",
  26. // 第二种使用方式,不会将div渲染进DOM,以template为根元素
  27. template: `<my-header></my-header>`,
  28. // 第二步,需要在根实例当中使用它
  29. components: {
  30. 'my-header': Header
  31. }
  32. });
  33. </script>
  34. </body>
  35. </html>

对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。

在局部组件中使用子组件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. <style>
  8. body {
  9. margin: 0;
  10. }
  11. .box {
  12. width: 100%;
  13. height: 50px;
  14. background-color: #2aabd2;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div id="component-demo">
  20. </div>
  21. <script>
  22. // 定义一个局部组件,其实就是一个变量,它是一个object类型
  23. // 这个对象的属性与全局组件是一样的(除el属性外)
  24. let Fcontent = {
  25. template: `
  26. <div>
  27. <span>这是头条</span>
  28. </div>
  29. `
  30. };
  31. let Header = {
  32. template: `
  33. <div v-bind:class='{box: isBox}'>
  34. <button @click="count++">{{ count }}</button>
  35. <first-content></first-content>
  36. </div>
  37. `,
  38. data() {
  39. return {
  40. count: 0,
  41. isBox: true
  42. }
  43. },
  44. components: {
  45. 'first-content': Fcontent
  46. }
  47. };
  48. new Vue({
  49. el: "#component-demo",
  50. // 第二种使用方式,不会将div渲染进DOM,以template为根元素
  51. template: `<my-header></my-header>`,
  52. // 第二步,需要在根实例当中使用它
  53. components: {
  54. 'my-header': Header
  55. }
  56. });
  57. </script>
  58. </body>
  59. </html>

三、父子组件的通信

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. <style>
  8. body {
  9. margin: 0;
  10. }
  11. .box {
  12. width: 100%;
  13. height: 50px;
  14. background-color: #2aabd2;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div id="component-demo">
  20. </div>
  21. <script>
  22. // 定义一个局部组件,其实就是一个变量,它是一个object类型
  23. // 属性与全局组件是一样的
  24. let Fcontent = {
  25. template: `
  26. <div>
  27. <span>这是头条</span>
  28. {{ fdata }}
  29. </div>
  30. `,
  31. props: ['fdata']
  32. };
  33. let Header = {
  34. template: `
  35. <div v-bind:class='{box: isBox}'>
  36. <button @click="count++">{{ count }}</button>
  37. <first-content :fdata="fathData"></first-content>
  38. </div>
  39. `,
  40. data() {
  41. return {
  42. count: 0,
  43. isBox: true,
  44. fathData: "我是你爸爸~~~"
  45. }
  46. },
  47. components: {
  48. 'first-content': Fcontent
  49. }
  50. };
  51. new Vue({
  52. el: "#component-demo",
  53. // 第二种使用方式,不会将div渲染进DOM,以template为根元素
  54. template: `<my-header></my-header>`,
  55. // 第二步,需要在根实例当中使用它
  56. components: {
  57. 'my-header': Header
  58. }
  59. });
  60. </script>
  61. </body>
  62. </html>

四、子父之间的通信

父组件在mounted的时候,监听一个自定义事件。

给子组件绑定一个click事件之后,通过内建的方法$emit在父组件上触发一个事件,这个事件就是父组件监听的自定义事件。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. </div>
  11. <script>
  12. let myFooter = {
  13. template: `
  14. <div>
  15. <h1>我是儿子</h1>
  16. <button v-on:click="changeFatherSize">点击修改爸爸的字体</button>
  17. </div>
  18. `,
  19. methods: {
  20. changeFatherSize: function () {
  21. this.$emit('change-font', 1);
  22. }
  23. },
  24. };
  25. let myHeader = {
  26. template: `
  27. <div>
  28. <my-footer v-on:change-font="changeSize"></my-footer>
  29. <span :style="{ fontSize: fontSize + 'px'}">我是爸爸</span>
  30. </div>
  31. `,
  32. data(){
  33. return {
  34. fontSize: 26,
  35. }
  36. },
  37. methods: {
  38. changeSize: function (value) {
  39. console.log(value);
  40. this.fontSize += value;
  41. }
  42. },
  43. components: {
  44. 'my-footer': myFooter
  45. }
  46. };
  47. let App = {
  48. template: `
  49. <div>
  50. <my-header></my-header>
  51. </div>
  52. `,
  53. components: {
  54. 'my-header': myHeader,
  55. },
  56. };
  57. new Vue({
  58. el: "#app",
  59. template: `<App></App>`,
  60. components: {
  61. App
  62. }
  63. })
  64. </script>
  65. </body>
  66. </html>

五、平行组件之间的通信

平行组件之间可以通过一个中间Vue实例来进行通信。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <com-main></com-main>
  11. </div>
  12. <script>
  13. let bus = new Vue();
  14. let dogfa = {
  15. template: `
  16. <div>
  17. <button @click="dogfaClick">点击向djb道歉</button>
  18. </div>
  19. `,
  20. methods: {
  21. dogfaClick: function () {
  22. bus.$emit("dogfa_apo", "原谅我吧,请你大保健~~~");
  23. }
  24. },
  25. };
  26. let djb = {
  27. template: `
  28. <div v-show="isShow">原谅你了~~~</div>
  29. `,
  30. mounted () {
  31. bus.$on("dogfa_apo", (dogfasay)=> {
  32. if ( dogfasay ) {
  33. console.log("原谅你了~~~");
  34. }
  35. });
  36. },
  37. data () {
  38. return {
  39. isShow: false
  40. };
  41. }
  42. };
  43. let App = {
  44. template: `
  45. <div id="app">
  46. <dogfa></dogfa>
  47. <djb></djb>
  48. </div>
  49. `,
  50. components: {
  51. dogfa,
  52. djb
  53. }
  54. };
  55. new Vue({
  56. el: "#app",
  57. template: '<App></App>',
  58. components: {
  59. App
  60. },
  61. })
  62. </script>
  63. </body>
  64. </html>

六、混入

混入可以提高代码的重用性

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. </div>
  11. <script>
  12. let mixins = {
  13. methods: {
  14. show: function (name) {
  15. console.log(`${name} is here`);
  16. },
  17. hide: function (name) {
  18. console.log(`${name} is here`);
  19. }
  20. }
  21. };
  22. let myAlex = {
  23. template: `
  24. <div>
  25. <button @click="show('alex')">点我显示alex</button>
  26. <button @click="hide('alex')">点我隐藏alex</button>
  27. </div>
  28. `,
  29. mixins: [mixins]
  30. };
  31. let myPeiQi = {
  32. template: `
  33. <div>
  34. <button @click="show('peiqi')">点我显示peiqi</button>
  35. <button @click="hide('peiqi')">点我隐藏peiqi</button>
  36. </div>
  37. `,
  38. mixins: [mixins],
  39. };
  40. let App = {
  41. template: `
  42. <div>
  43. <my-alex></my-alex>
  44. <my-peiqi></my-peiqi>
  45. </div>
  46. `,
  47. components: {
  48. 'my-alex': myAlex,
  49. 'my-peiqi': myPeiQi,
  50. },
  51. };
  52. new Vue({
  53. el: "#app",
  54. template: `<App></App>`,
  55. components: {
  56. App
  57. }
  58. })
  59. </script>
  60. </body>
  61. </html>

七、插槽

有时候我们需要向组件传递一些数据,这时候可以使用插槽

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .nav-link {
  8. width: 100px;
  9. height: 100px;
  10. background-color: #2aabd2;
  11. float: left;
  12. margin-left: 5px;
  13. text-align: center;
  14. line-height: 100px;
  15. }
  16. </style>
  17. <script src="../statics/vue.js"></script>
  18. </head>
  19. <body>
  20. <div id="app01">
  21. <com-content>登录</com-content>
  22. <com-content>注册</com-content>
  23. <com-content>最热</com-content>
  24. <com-content>段子</com-content>
  25. <com-content>42区</com-content>
  26. <com-content>图片</com-content>
  27. </div>
  28. <script>
  29. Vue.component('com-content', {
  30. template: `
  31. <div class="nav-link">
  32. <slot></slot>
  33. </div>
  34. `
  35. });
  36. new Vue({
  37. el: "#app01",
  38. })
  39. </script>
  40. </body>
  41. </html>

八、具名插槽

操作使用了组件的复用,如果我们在同一个组件内写入不同的页面呢?此时,我们需要多个插槽,并且给不同的内容命名。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .nav-link {
  8. width: 100px;
  9. height: 100px;
  10. background-color: #2aabd2;
  11. float: left;
  12. margin-left: 5px;
  13. text-align: center;
  14. line-height: 100px;
  15. }
  16. </style>
  17. <script src="../statics/vue.js"></script>
  18. </head>
  19. <body>
  20. <div id="app01">
  21. <base-layout>
  22. <template slot="header">
  23. <h1>这是标题栏</h1>
  24. </template>
  25. <template>
  26. <h2>这是内容</h2>
  27. </template>
  28. <template slot="footer">
  29. <h3>这是页脚</h3>
  30. </template>
  31. </base-layout>
  32. </div>
  33. <script>
  34. let baseLayout = {
  35. template: `
  36. <div class="container">
  37. <header>
  38. <slot name="header"></slot>
  39. </header>
  40. <main><slot></slot></main>
  41. <footer>
  42. <slot name="footer"></slot>
  43. </footer>
  44. </div>
  45. `
  46. };
  47. new Vue({
  48. el: "#app01",
  49. components: {
  50. "base-layout": baseLayout
  51. }
  52. })
  53. </script>
  54. </body>
  55. </html>

我们还是可以保留一个未命名插槽,这个插槽是默认插槽,也就是说它会作为所有未匹配到插槽的内容的统一出口。

九、在组件上使用v-model

自定义事件也可以用于创建支持 v-model 的自定义输入组件。记住:

  1. `<input v-model="searchText">`

等价于:

  1. <input
  2. v-bind:value="searchText"
  3. v-on:input="searchText = $event.target.value"
  4. >

当用在组件上时,v-model 则会这样:

  1. <custom-input
  2. v-bind:value="searchText"
  3. v-on:input="searchText = $event"
  4. ></custom-input>

为了让它正常工作,这个组件内的 <input> 必须:

  1. 将其 value 特性绑定到一个名叫 value prop
  2. 在其 input 事件被触发时,将新的值通过自定义的 input 事件抛出

写成代码之后是这样的:

  1. Vue.component('custom-input', {
  2. props: ['value'],
  3. template: `
  4. <input
  5. v-bind:value="value"
  6. v-on:input="$emit('input', $event.target.value)"
  7. >
  8. `
  9. })

现在 v-model 就应该可以在这个组件上完美地工作起来了:

  1. <custom-input v-model="searchText"></custom-input>

如下是在组件中使用v-model示例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="../statics/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. </div>
  11. <script>
  12. let Model = {
  13. template: `
  14. <div>
  15. <input
  16. v-bind:value="value"
  17. v-on:input="$emit('input', $event.target.value)"
  18. />
  19. <h1>{{ value }}</h1>
  20. `,
  21. props: ['value']
  22. };
  23. let App = {
  24. template: `
  25. <div>
  26. <custom-input v-model="searchText"></custom-input>
  27. `,
  28. components: {
  29. 'custom-input': Model,
  30. },
  31. data(){
  32. return {
  33. searchText: "",
  34. }
  35. }
  36. };
  37. new Vue({
  38. el: "#app",
  39. template: `<App></App>`,
  40. components: {
  41. App,
  42. }
  43. })
  44. </script>
  45. </body>
  46. </html>

十、使用组件的注意事项

注意事项一:单个根元素

当构建一个内容页面的组件时,我们的组件可能包含多个HTML标签。

  1. <h1>Hello World</h1>
  2. <h2>Hello Vue</h2>

然而如果你在模板中尝试这样写,Vue 会显示一个错误,并解释道 every component must have a single root element (每个组件必须只有一个根元素)。你可以将模板的内容包裹在一个父元素内,来修复这个问题,例如:

  1. <div>
  2. <h1>Hello World</h1>
  3. <h2>Hello Vue</h2>
  4. </div>

注意事项二:解析特殊HTML元素

有些 HTML 元素,诸如 <ul><ol><table><select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li><tr><option>,只能出现在其它某些特定的元素内部。

这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:

  1. <table>
  2. <blog-post-row></blog-post-row>
  3. </table>

这个自定义组件 <blog-post-row> 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is 特性给了我们一个变通的办法:

  1. <table>
  2. <tr is="blog-post-row"></tr>
  3. </table>

需要注意的是如果我们从以下来源使用模板的话,这条限制是不存在的:

  1. 字符串 (例如:template: '...')
  2. 单文件组件 (.vue)
  3. <script type="text/x-template">

Vue 组件系统的更多相关文章

  1. vue组件系统

    1. 全局组件的注册 <body>    <div id="app">        <!--<global-component>< ...

  2. 【Vue组件系统】

    目录 全局组件 局部组件 注册 子组件的用法 父子组件的通讯 子父组件的通讯 非父子组件的通讯 混入 插槽 具名插槽 使用组件的注意事项 使用组件实现导航栏 "vue.js既然是框架,那就不 ...

  3. 【Vue】详解Vue组件系统

    Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用—— 全局注册 通过Vue.comp ...

  4. Vue框架之组件系统

    1,Vue组件系统之全局组件 1.1Vue全局组件的在实例化调用Vue的模板中导入组件的名称 <!DOCTYPE html> <html lang="zh-cn" ...

  5. Vue.js之组件系统

    vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. Vue.js组件系统 每一个新技 ...

  6. vue学习之四组件系统

    vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. 一.Vue.js组件系统 每一个 ...

  7. JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

    前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...

  8. canvas实现倒计时效果示例(vue组件内编写)

    前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...

  9. 一套代码小程序&Web&Native运行的探索06——组件系统

    接上文:一套代码小程序&Web&Native运行的探索05——snabbdom 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tre ...

随机推荐

  1. vue pc element-ui class

    按需引入element-ui npm install babel-plugin-component -D   先安装这个 然后在babelrc中配置: 在plugins中加入红色框的那一部分 [ &q ...

  2. 微信小程序--更换用户头像/上传用户头像/更新用户头像

    changeAvatar:function (){ var that=this; wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'c ...

  3. [RK3288] 外接USB设备出现丢数

    CPU:RK3288 系统:Android 5.1 主板外接 USB 接口的外设,经常会出现丢数的现象,这种问题在很多 USB 接口的外设上都遇到过,例如:USB读卡器.USB扫描枪等 有一个共同点是 ...

  4. T-MAX—项目系统设计与数据库设计

    团队作业第四次-项目系统设计与数据库设计 这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第四次-项目系统设计与数据库设计 团队名称 T-MAX 这个作业的目标 在开 ...

  5. 如何在Windows Server 2008服务器中把Tomcat启动程序添加到服务中

    转自:https://blog.51cto.com/zdytesting/2314093 tomcat所在的bin目录: 添加服务: service install service_name 移除服务 ...

  6. python pip 安装插件权限问题及 指定pip国内镜像源

  7. BitmapShader填充图形

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.*; imp ...

  8. 【精华】PHP网站验证码不显示的终结解决方案

    PHP网站验证码不显示,这个是个很基础的PHP问题了,不过有点时候会比较让开发者比较头疼了.很多解决方案仅仅考虑到gd2,却忽略了另外一个很重要的因素了,相信在了解本教程之后,验证码不显示基本上就不算 ...

  9. javascript中的Error对象

    在javascript中一旦代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个基本的属性: ...

  10. PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)

    1048 Find Coins (25 分)   Eva loves to collect coins from all over the universe, including some other ...