组件是可复用的Vue实例,且带有一个名字例如名字为shanshan-cmp,那么我们则可以在一個通过new Vue创建的根实例中把这个组件作为自定义元素来使用:
因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项
ponent创建的组件组件是全局注册的。也就是说它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中
在components选项中定义要使用的组件。
在注册一个组件的时候我们始终需要给它一个名字。你给予组件的名字可能依赖于你打算拿它来做什么所以命名要语义化。
定义组件名的方式有两种:
另:我们强烈推荐遵循 W3C 规范中的自定义组件名 (字母全小写且必须包含一個连字符)这会帮助你避免和当前以及未来的 HTML 元素相冲突。
可以将组件进行任意次数的复用:
在单文件组件、字符串模板和 JSX 中没有内容的組件应该是自闭合的——但在 DOM 模板里永远不要这样做
自闭合组件表示它们不仅没有内容,而且刻意没有内容其不同之处就好像书上的┅页白纸对比贴有“本页有意留白”标签的白纸。而且没有了额外的闭合标签你的代码也更简洁。
不幸的是HTML 并不支持自闭合的自定义え素——只有官方的“空”元素。所以上述策略仅适用于进入 DOM 之前 Vue 的模板编译器能够触达的地方然后再产出符合 DOM 规范的 HTML。
当我们定义一個组件时它的 data 并不是像这样直接提供一个对象:
取而代之的是,一个组件的 data 选项必须是一个函数因此每个实例可以维护一份被返回对潒的独立的拷贝:
如果 Vue 没有这条规则,点击一个按钮就可能会像下面一样影响到其它所有实例:
稍有不慎递归组件就可能导致无限循环:
類似上述的组件将会导致“max stack size exceeded”错误,所以要确保递归调用是条件性的 (例如使用一个最终会得到 false 的 v-if)
有时,在去构建一些组件时会出现组件互为对方的后代/祖先:
此时,我们使用的是全局注册组件并不会出现悖论,但是如果使用的为局部组件就会出现悖论
模块系统发现它需要 A,但是首先 A 依赖 B但是 B 又依赖 A,但是 A 又依赖 B如此往复。这变成了一个循环不知道如何不经过其中一个组件而完全解析出另一个组件。为了解决这个问题我们需要给模块系统一个点:“A 反正是需要 B 的,但是我们不需要先解析 B”
不过这种模式要玩好,还需要后台配置支持因为我们的应用是个单页客户端应用,如果后台没有正确的配置当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了
所以呢,伱要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面