组件注册

image.png

image.png

组件命名方式注意

image.png

注册全局组件

  1. <div id="app">
  2. <button-count></button-count>
  3. </div>
  4. <script>
  5. Vue.component('button-count',{
  6. data:function(){
  7. return{
  8. count:0
  9. }
  10. },
  11. template:'<button @click="handle">点击了{{count}}次</button>',
  12. methods:{
  13. handle(){
  14. this.count += 2
  15. }
  16. }
  17. })
  18. var vm = new Vue({
  19. el:'#app',
  20. data() {
  21. return {
  22. }
  23. },
  24. })
  25. </script>

注册局部组件

局部注册组件只能在父组件中使用

  1. <div id="app">
  2. <hello-world></hello-world>
  3. </div>
  4. <script>
  5. var HelloWorld = {
  6. data:function(){
  7. return{
  8. msg:0
  9. }
  10. },
  11. template:'<button @click="handle">加{{msg}}次</button>',
  12. methods:{
  13. handle(){
  14. this.msg += 1
  15. }
  16. }
  17. }
  18. var vm = new Vue({
  19. el:'#app',
  20. data() {
  21. return {
  22. }
  23. },
  24. methods: {
  25. },
  26. components:{
  27. 'hello-world':HelloWorld
  28. }
  29. })
  30. </script>

组件传值

props命名规则

image.png
image.png

父组件向子组件传值

组件内通过props接受传递过来的值

image.png

  1. <div id="app">
  2. <son :title='father' content='hello'></son>
  3. <son title='值'></son>
  4. </div>
  5. <script>
  6. Vue.component('son',{
  7. props:['title','content'],
  8. data:function(){
  9. return{
  10. msg:'子组件'
  11. }
  12. },
  13. template:'<div>{{msg}} === {{title}} ====={{content}}</div>'
  14. })
  15. var vm = new Vue({
  16. el:'#app',
  17. data:{
  18. father:'我是父组件的内容'
  19. },
  20. methods: {
  21. },
  22. })
  23. </script>

传递array与object,number,string 最好用:绑定 否则传递过来的参数都会是string

  1. <div class="app">
  2. <temp1 :msg='msg' :datas='datas' :per='per' :age='12'></temp1>
  3. </div>
  4. <template id="temp1">
  5. <div>
  6. <p>模板一</p>
  7. <span>{{msg}}</span>
  8. <span>{{typeof age}}</span>
  9. <ul>
  10. <li v-for='(item,index) in datas' :key='index'>{{item}}</li>
  11. </ul>
  12. <p v-for='(item,index) in per' :key='index'>{{item.name}}-{{item.age}}</p>
  13. </div>
  14. </template>
  15. <script>
  16. var temp1 = {
  17. template:'#temp1',
  18. props:['msg','datas','per','age'],
  19. }
  20. var vm = new Vue({
  21. el:'.app',
  22. data() {
  23. return {
  24. msg:'hello',
  25. datas:['he','li','wang'],
  26. per:[{name:'wang',age:12},{name:'ran',age:22}]
  27. }
  28. },
  29. components:{
  30. 'temp1':temp1
  31. }
  32. })
  33. </script>

子组件向父组件传值

$emit

image.png
image.png
image.png

  1. <div class="app">
  2. <div :style='{fontSize:fontSize + "px"}'>{{msg}}</div>
  3. <temp1 @large-text='handle($event)' ></temp1>
  4. </div>
  5. <template id="temp1">
  6. <div>
  7. <button @click='$emit("large-text",5)'>加大</button>
  8. </div>
  9. </template>
  10. <script>
  11. var temp1 = {
  12. template:'#temp1',
  13. }
  14. var vm = new Vue({
  15. el:'.app',
  16. data() {
  17. return {
  18. msg:'hello',
  19. fontSize:10
  20. }
  21. },
  22. methods: {
  23. handle(val){
  24. this.fontSize += val
  25. }
  26. },
  27. components:{
  28. 'temp1':temp1
  29. }
  30. })
  31. </script>

非父子组件传值

eventhub兄弟组件通信

image.png

  1. <div id="app">
  2. <div @click='handle'>销毁</div>
  3. <temp1></temp1>
  4. <temp2></temp2>
  5. </div>
  6. <template id="temp1">
  7. <div @click='handle'>hello{{num}}</div>
  8. </template>
  9. <template id="temp2">
  10. <div @click='handle'>world{{num}}</div>
  11. </template>
  12. <script>
  13. var bus = new Vue()
  14. var temp1 = {
  15. template:'#temp1',
  16. data(){
  17. return{
  18. num:0
  19. }
  20. },
  21. methods:{
  22. handle(){
  23. bus.$emit('world',10)
  24. }
  25. },
  26. mounted() {
  27. bus.$on('hello',(val)=>{
  28. this.num +=val
  29. })
  30. },
  31. }
  32. var temp2 = {
  33. template:'#temp2',
  34. data(){
  35. return{
  36. num:0
  37. }
  38. },
  39. methods:{
  40. handle(){
  41. bus.$emit('hello',-1)
  42. }
  43. },
  44. mounted() {
  45. bus.$on('world',(val)=>{
  46. this.num +=val
  47. })
  48. },
  49. }
  50. var vm = new Vue({
  51. el:'#app',
  52. data() {
  53. return {
  54. }
  55. },
  56. methods: {
  57. handle(){
  58. bus.$off('hello')
  59. bus.$off('world')
  60. }
  61. },
  62. components:{
  63. 'temp1':temp1,
  64. 'temp2':temp2
  65. }
  66. })
  67. </script>

插槽

具名插槽

image.png

作用域插槽

  1. <div id="app">
  2. <listbox :list='list'>
  3. <template slot-scope="stotprop">
  4. <strong v-if='stotprop.info.id === 3' style='color:red'>{{stotprop.info.name}}</strong>
  5. <span v-else>{{stotprop.info.name}}</span>
  6. </template>
  7. </listbox>
  8. </div>
  9. <template id="lists">
  10. <div>
  11. <li :key="item.id" v-for='(item,index) in list'>
  12. <slot :info='item'>{{item.name}}</slot>
  13. </li>
  14. </div>
  15. </template>
  16. <script>
  17. var listbox = {
  18. template:"#lists",
  19. props:['list']
  20. }
  21. var vm = new Vue({
  22. el:'#app',
  23. data() {
  24. return {
  25. list:[{id:1,name:'jack'},{id:2,name:'tom'},{id:3,name:'jerry'}]
  26. }
  27. },
  28. components:{
  29. 'listbox':listbox
  30. }
  31. })
  32. </script>