Blogger Information
Blog 37
fans 0
comment 1
visits 28628
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
VUE组件
kong
Original
212 people have browsed it

组件化开发

prop向子组件传递数据

  1. <template>
  2. <!-- 绑定变量传值 -->
  3. <Content :title="title" :msg="msg" :arr="arr" :ob="ob" />
  4. </template>
  5. <script>
  6. import OneCom from "./components/OneCom.vue";
  7. export default {
  8. data() {
  9. return {
  10. title: "标题",
  11. msg: "消息",
  12. arr : [
  13. '苹果',
  14. '香蕉',
  15. '梨子'
  16. ],
  17. ob: {
  18. name: "小明",
  19. age: "18岁"
  20. }
  21. };
  22. },
  23. components:{
  24. Content
  25. }
  26. };
  27. </script>
  28. <!--子组件-->
  29. <template>
  30. <div>
  31. <div>{{ title }}</div>
  32. <div>{{ msg }}</div>
  33. <div>{{ arr }}</div>
  34. <div>{{ ob }}</div>
  35. </div>
  36. </template>
  37. <script>
  38. export default {
  39. data() {
  40. return {
  41. };
  42. },
  43. // 1、props 参数,获取父文件的传值
  44. props: ["title", "msg", "arr", "ob"]
  45. };
  46. </script>

接收值并限制类型

有两种接收值的方法

第一种 数组字符串方法

props['接收值1','接收值2'...]

第二种 对象限制接收参数的类型

数组和对象要用方法返回

type: 类型 String ,Number, Object, Arr…
default: 不传值,给一个默认值
required: true,必须传的值,

子组件向父组件传值,事件传值

  1. //App.vue文件
  2. <template>
  3. <!-- 在父元素中使用子元素自定的事件名 -->
  4. <Content @click="EditChange()" />
  5. </template>
  6. <script>
  7. import Content from "./components/aj.vue"; //子元素
  8. export default{
  9. data(){
  10. return{
  11. value: '父组件值'//默认值
  12. }
  13. },
  14. methods: {
  15. //操作方法
  16. EditChange(){
  17. this.value = "改变的值"
  18. }
  19. },
  20. components: {
  21. //组件
  22. Content,
  23. }
  24. }
  25. </script>
  26. //aj.vue文件
  27. <template>
  28. <div>
  29. <button @click="edit()">点击改变父组件的值</button>
  30. </div>
  31. </template>
  32. <script>
  33. export default{
  34. data(){
  35. return{
  36. }
  37. },
  38. methods:{
  39. edit(value){
  40. //使用 $emit方法 $emit('自定义事件名',要传的值)
  41. this.$emit('EditChange',value)
  42. }
  43. }
  44. }
  45. </script>

父子组件访问方式

父组件访问子组件 $refs

  1. <!--父页面-->
  2. <hi :name="name" :age="age" :sex="sex" ref="hi"/>
  3. export default{
  4. mounted(){
  5. // console.log(this.$refs.hi)
  6. },
  7. }

子组件获取父组件的值 $parent 重叠性很强不适合使用

子组件获取根组件的值 $root

  1. <!--父页面-->
  2. <hi :name="name" :age="age" :sex="sex" ref="hi"/>
  3. <!--子页面-->
  4. export default{
  5. mounted(){
  6. // 子组件获取父组件的值 $parent 重叠性很强不适合使用
  7. // console.log(this.$parent)
  8. // 子组件获取根组件的值 $root
  9. // console.log(this.$root)
  10. }
  11. }

slot插槽

使用 slot 标签,做为占位:也叫插槽

  1. //OneCom.vue子文件
  2. <template>
  3. <div>
  4. <slot></slot>
  5. </div>
  6. </template>
  7. //App.vue 文件
  8. <template>
  9. <div>
  10. // 使用子组件,传button标签
  11. <one-com>
  12. <button>按钮</button>
  13. </one-com>
  14. </div>
  15. </template>
  16. <script>
  17. import OneCom from "./components/OneCom";
  18. export default {
  19. data() {
  20. return {};
  21. },
  22. components: {
  23. OneCom
  24. }
  25. };
  26. </script>

slot插槽命名

如果多个插槽,传2次按钮,会出现4个按钮,所以要用命名的方法

  1. //OneCom.vue 子文件
  2. <template>
  3. <div>
  4. <div class="flex">
  5. <slot name="top"></slot>
  6. <slot></slot>
  7. </div>
  8. </div>
  9. </template>
  10. //App.vue
  11. <template>
  12. <div>
  13. <one-com>
  14. // 使用 template 标签,v-slot参数,找到对应的插槽name名字
  15. <template v-slot:top>
  16. <button>按钮</button>
  17. </template>
  18. <button>按钮</button>
  19. </one-com>
  20. <one-com>
  21. <a>a链接</a>
  22. // 也可以#简写,是v-slot的语法糖
  23. <template #top>
  24. <a>a链接</a>
  25. </template>
  26. </one-com>
  27. <one-com>
  28. // 查找默认插槽
  29. <template v-slot:default>
  30. <a>a标签</a>
  31. </template>
  32. </one-com>
  33. </div>
  34. </template>
  35. <script>
  36. import OneCom from "./components/OneCom";
  37. export default {
  38. components: {
  39. OneCom,
  40. }
  41. };
  42. </script>

父级使用插槽,使用子组件数据

  1. //子元素
  2. <template>
  3. <div>
  4. <div class="flex">
  5. <slot :list="list"></slot>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. data(){
  12. return{
  13. list:[1,2,3,4,5]
  14. }
  15. }
  16. }
  17. </script>
  18. //App.vue
  19. <template>
  20. <div>
  21. <OneCom>
  22. <!-- 作用域插槽此处的data命名可以任意 default代表着子组件的slot默认name值-->
  23. <template v-slot:default="data">
  24. <ul>
  25. <li v-for="item in data.list" :key="item" @click="lis">
  26. {{ item }}
  27. </li>
  28. </ul>
  29. </template>
  30. </OneCom>
  31. </div>
  32. </template>
  33. <script>
  34. import OneCom from './OneCom.vue'
  35. export default {
  36. data(){
  37. return{}
  38. },
  39. components:{
  40. OneCom
  41. }
  42. }
  43. </script>

使用provide 与inject跨通信传值(父组件改变子孙组件)

  1. //OneCom.vue 子元素
  2. <template>
  3. <div>
  4. <h1>
  5. {{ newMessage }}
  6. </h1>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. inject: ['message'], //接收父组件传递的值
  12. data(){
  13. return{}
  14. },
  15. computed:{
  16. newMessage(){
  17. return this.message()
  18. }
  19. },
  20. }
  21. </script>
  22. //App.vue
  23. <template>
  24. <div>
  25. <HelloWorld></HelloWorld>
  26. <button @click="msgs">点击</button>
  27. </div>
  28. </template>
  29. <script>
  30. import OneCom from './OneCom.vue'
  31. export default {
  32. data(){
  33. return{
  34. message:"helloWorld"
  35. }
  36. },
  37. provide(){
  38. return{
  39. message:()=> this.message //传递到子孙组件动态值
  40. }
  41. },
  42. methods:{
  43. msgs(){ //点击改变的事件
  44. this.message = '消息改变了'
  45. }
  46. }
  47. }
  48. </script>
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post