zoukankan      html  css  js  c++  java
  • vue 父子组件 基础应用scrollball v-model sync


    # 组件之间通信 可以通过 v-model 子组件可以通过 改变数据来改变父组件的数组
     * v-model  子组件需要接受value属性,需要出发this.$emit("input","data");
        v-model="posStart" === @input="input" :value="posStart" //"input" 底层自己实现 不用写
     * sync 同步子组件与父组件的值 子组件需要接受 value1 的值,需要this.$emit("update:value1","data")
      :value1.sync = "posStart" === @update:value1 ="input" :value1="posStart" //===后面的父组件需要写input函数 带sync不用写
     * 传统的props $emit

    # 父组件调用子组件的函数 
     * 如果是某一个特定的组件 在父组件调用子组件的地方加上ref,用this.$refs.refName.fn();
     * 如果是需要调用所有子组件的方法,可以在父组件中使用$children,调用子组件的方法

    1.父组件App

     1 <template>
     2   <div id="app">
     3     <!--
     4     <ScrollBall @input="input" :value="posStart" color="green"  :target="posTarget"></ScrollBall>-->
     5     <!-- v-model 底层 实现@input="input" :value="posStart" 父组件中不需要写 input函数 v-model底层会自己写赋值-->
     6     <ScrollBall v-model="posStart" color="yellow" :target="posTarget"></ScrollBall>
     7     <ScrollBall ref="ball2" :value.sync="posStart" color="red" :target="posTarget"></ScrollBall>
     8     <!--
     9     <ScrollBall @update:value1 ="input" :value1="posStart"  color="red" :target="posTarget"></ScrollBall>
    10     -->
    11     <button @click="stopHandle"> stop </button>
    12   </div>
    13 </template>
    14 
    15 <script>
    16 import ScrollBall from "./components/ScrollBall.vue";
    17 export default {
    18   name: "app",
    19   beforeUpdate() {
    20   //  console.log(this.posStart);
    21   },
    22   data() {
    23     return {
    24       posStart: 160,
    25       posTarget: 400
    26     };
    27   },
    28   components: {
    29     ScrollBall
    30   },
    31   methods: {
    32     stopHandle(){
    33       this.$children.forEach(ele=>{
    34         ele.stop();
    35       });
    36       console.log(this.$children);
    37     //  this.$refs.ball2.stop();
    38     }
    39   /*  input(value) {
    40       this.posStart = value;
    41     }*/
    42   }
    43 };
    44 </script>
    45 
    46 <style lang="less">
    47 </style>

    2.子组件

     1 <template>
     2   <div class="ball" :style="style" :id="ballId"></div>
     3 </template>
     4 
     5 <script>
     6 export default {
     7   name: "ScrollBall",
     8   mounted(){
     9     let ball = document.getElementById(this.ballId);
    10    //页面加载后让小球运动 
    11     let fn = () => {
    12         let left = this.value;
    13       //  console.log("left:",left);
    14         if(left >= this.target){
    15             return cancelAnimationFrame(this.timer);
    16         }
    17       //  left += 5;
    18         this.$emit("input",left+1); //交给父亲去改
    19         this.$emit("update:value",left+1);
    20         ball.style.transform = `translate(${left}px)`;
    21         this.timer = requestAnimationFrame(fn);
    22     }
    23     this.timer = requestAnimationFrame(fn); //此函数只执行一次
    24   },
    25   props: {
    26     color: {
    27       type: String,
    28       default:"white"
    29     },
    30     value:{
    31       type:Number,
    32       default:0
    33     },
    34     target:{
    35       type:Number,
    36       default:0
    37     }
    38   },
    39   computed: {
    40     style(){
    41       return {background:this.color}
    42     },
    43     ballId(){
    44       return "ball"+this._uid;
    45     }
    46   },
    47   methods:{
    48     stop(){
    49        cancelAnimationFrame(this.timer);
    50     }
    51   }
    52 };
    53 </script>
    54 <style lang="less">
    55 .ball {
    56    100px;
    57   height: 100px;
    58   border: 1px solid #000;
    59   border-radius: 50%;
    60   box-sizing: border-box;
    61 }
    62 </style>

    涉及的知识点:


    vue-cli生成的目录结构
    vue create name
        node_modules 第三方包存储目录s
        public 静态资源 已被托管
        src 源代码
            -assets 资源目路 存放静态资源
            -components 存储其他组件的目录
            -App.vue 根组件
            -main.js 入口文件
        .gitignore git 忽略文件
        
    .vue单文件组件
        template 组件的模板
        注意 只有一个根节点

    script 组件的js 配置组件选项

    style scoped 作用域 我的样式只用于当前的组件,不加就是全局的样式

    vue组件开发基本使用
    scrollball

    # 不用创建项目 vue 应用 # npm install -g @vue/cli-service-global 
    ## 完了之后用vue serve
    # 创建项目 vue create vue-apply

    # 父组件传递背景颜色给子组件 :子组件接受颜色后,需要动态绑定 :style={background:color}  可以用计算属性 :style='stlyleComputed'

    # 父组件传值的时候带上:是本身变量,不带是字符串

    # 子组件修改父组件的值$emit ,父组件绑定事件用@

    # 可以用requestAnmiationFrame来代替setTimeout

    # 尽量通过修改父组件的数据,来跟新子组件
  • 相关阅读:
    JQuery学习笔记(1)——选择器
    Web前端——表单提交和Js添加选项
    Web前端——JavaScript练习
    Web前端——css
    Web前端——JavaScript笔记
    sirius的学习笔记(2)
    sirius的python学习笔记(1)
    Get和Post的请求
    IIS的配置
    一般处理程序aspx
  • 原文地址:https://www.cnblogs.com/moon-yyl/p/11801201.html
Copyright © 2011-2022 走看看