Как бы я изменил только одно свойство объекта - PullRequest
0 голосов
/ 05 апреля 2020

Я создаю объект, и только одно из его свойств должно быть изменено в соответствии с другим значением, поэтому переключатель будет идеальным, но я не могу поместить переключатель внутри инициализации объекта. Я знаю, что это, вероятно, что-то довольно легко, но я новичок в JS.

class DegreesCircle extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            type: this.props.type,
            degrees: this.props.degrees
        }
    }

    render() {
        let circleStyle = {
            position: "relative",
            left: "50%",
            top: "45%",
            transform: "translate(-50%, 0)",

            //I need this to change according to this.props.type
            //I'd put a switch in here if I could
            borderColor: "a value",
            borderStyle: "solid",
            borderWidth: "0.5vh",
            borderRadius: "50%",
            width: "20vh",
            height: "20vh",
        }

Как мне изменить только свойство borderColor circleStyle?

РЕДАКТИРОВАТЬ: Я не смотрю поставить переключатель спереди или что-то. Я пытаюсь изменить одно свойство объекта.

Ответы [ 9 ]

1 голос
/ 05 апреля 2020

Вы можете использовать синтаксис распространения

 let circleStyle = {
        position: "relative",
        left: "50%",
        top: "45%",
        transform: "translate(-50%, 0)",
        borderStyle: "solid",
        borderWidth: "0.5vh",
        borderRadius: "50%",
        width: "20vh",
        height: "20vh",
    }


switch (this.props.type) {
case x: 
  circleStyle = {
      ...circleStyle,
      borderColor: value,
  }
  break;
case y:
  ....
0 голосов
/ 05 апреля 2020

Вы можете использовать Синтаксис распространения на объектах

const circleStyle = {
  position: "relative",
  left: "50%",
  top: "45%",
  transform: "translate(-50%, 0)",
  borderColor: "a value",
  borderStyle: "solid",
  borderWidth: "0.5vh",
  borderRadius: "50%",
  width: "20vh",
  height: "20vh",
};

let prop = {
  borderStyle: "dashed",
};

let newCircleStyle = {
  ...circleStyle,
  borderStyle: prop.borderStyle || "solid",
};

console.log(JSON.stringify(newCircleStyle, null, 2));

prop = {
  // borderStyle: "dashed",
};

newCircleStyle = {
  ...circleStyle,
  borderStyle: prop.borderStyle || "solid",
};

console.log(JSON.stringify(newCircleStyle, null, 2));
0 голосов
/ 05 апреля 2020

Есть несколько способов, которыми вы можете go об этом, вот примеры того, как вы можете реализовать это, в итоге, реализация здесь использует объект как Ha sh, чтобы возвратить значение га * 1019. * используя тип в качестве ключа.

    class Circle { // extends React.Component.
            constructor(props = {}) {
              this.props = props; 
            }
        
            render() {
                let circleStyle = {
                    position: "relative",
                    left: "50%",
                    top: "45%",
                    transform: "translate(-50%, 0)",
        
                    //I need this to change according to this.props.type
                    //I'd put a switch in here if I could
                    borderColor: this.borderColor[ this.props.type ] || 'default',
                    borderStyle: "solid",
                    borderWidth: "0.5vh",
                    borderRadius: "50%",
                    width: "20vh",
                    height: "20vh",
                }
                
                console.log( circleStyle.borderColor );
            }

            get borderColor() {
               return {
                  'type_a': 'red',
                  'type_b': 'blue',
                  'type_c': 'green',
               }
            }
        } 
      
        // default value
        const circle_1 = new Circle({});
        circle_1.render();
        // red
        const circle_2 = new Circle({ type: 'type_a' });
        circle_2.render();
        // blue
        const circle_3 = new Circle({ type: 'type_b' });
        circle_3.render();
        // green
        const circle_4 = new Circle({ type: 'type_c' });
        circle_4.render();

В приведенном выше примере, если тип не определен, вместо него будет использоваться значение по умолчанию.

На основании вашего исходного примера кажется, что вы используете React. Я бы посоветовал извлечь стили в отдельную функцию, чтобы ваш метод render() стал немного более чистым, в том числе благодаря тому, что вы могли бы протестировать эту часть изолированно.

const BORDR_TYPES = {
                  'type_a': 'red',
                  'type_b': 'blue',
                  'type_c': 'green',
           };
           
           
// this one extracts the type property from the properties object when generateStyles is called
// and initialize the default value to empty object when no value is passed to this function.
const generateStyles = ( { type, ...props } = {} )  => ({
                    position: "relative",
                    left: "50%",
                    top: "45%",
                    transform: "translate(-50%, 0)",
        
                    //I need this to change according to this.props.type
                    //I'd put a switch in here if I could
                    borderColor: BORDR_TYPES[ type ] || 'default',
                    borderStyle: "solid",
                    borderWidth: "0.5vh",
                    borderRadius: "50%",
                    width: "20vh",
                    height: "20vh",
})

console.log( generateStyles().borderColor );
console.log( generateStyles({ type: 'type_a' }).borderColor );
console.log( generateStyles({ type: 'type_b' }).borderColor );
console.log( generateStyles({ type: 'type_c'}).borderColor );

 

class Circle { // extends React.Component.
            constructor(props = {}) {
              this.props = props; 
            }
        
            render() {
                const circleStyle = generateStyles( this.props );
                
                console.log( circleStyle.borderColor );
            }
        }
0 голосов
/ 05 апреля 2020

В итоге я установил значение следующим образом:

        switch (this.state.type) {
            case (type.A):
                circleStyle.borderColor = "#ff3863";
                break;
            case (type.B):
                circleStyle.borderColor = "#000000";
                break;
            case (type.C):
                circleStyle.borderColor = "#000000";
                break;
            default:
                circleStyle.borderColor = "#000000";
                break;
        }

Это именно то, что я искал, изменив только одно свойство объекта:

circleStyle.borderColor = "#000000";
0 голосов
/ 05 апреля 2020

Я не могу думать о каком-либо другом способе, более простом, чем этот, если у вас не много значений и они где-то определены.

//Why not do this?

var PossibleValues = {
  type1 : value1,
  type2 : value2
};

//Then
let circleStyle = {
    position: "relative",
    left: "50%",
    top: "45%",
    transform: "translate(-50%, 0)",
    //  You just get the value by calling it's key
    borderColor: possibleValues[this.state.type],
    borderStyle: "solid",
    borderWidth: "0.5vh",
    borderRadius: "50%",
    width: "20vh",
    height: "20vh",
}
0 голосов
/ 05 апреля 2020

сделайте это до создания объекта, а затем присвойте ему нужный атрибут;

let borderClr;
switch (this.props.type) {
  case 'val1':
    borderClr = 'someThing'
    break;
  case 'val2':
    borderClr = 'someThingELSE'
    break;

  default:
    break;
}


let circleStyle = {
  position: "relative",
  left: "50%",
  top: "45%",
  transform: "translate(-50%, 0)",
  borderColor: borderClr,
  borderStyle: "solid",
  borderWidth: "0.5vh",
  borderRadius: "50%",
  width: "20vh",
  height: "20vh",
}
0 голосов
/ 05 апреля 2020

Вы можете записать переключатель перед инициализацией объекта.

render(){
  let borderColor = '';
  switch(this.state.type){
     case "TYPE_A": borderColor = 'red';break;
     case "TYPE_B": borderColor = 'blue';break;
     default: borderColor = 'green';break;
  }
  // then use it in the object
   let circleStyle = {
        position: "relative",
        left: "50%",
        top: "45%",
        transform: "translate(-50%, 0)",
        borderColor,
        //rest of the attributes
     }
     //rest of the render()

 }
0 голосов
/ 05 апреля 2020

Вы можете использовать команду распространения ... для объединения объектов:

let circleStyle = { // base styles
  position: "relative",
  left: "50%",
  top: "45%",
  transform: "translate(-50%, 0)"
}
if (true) { // insert condition
  circleStyle = { ...circleStyle,
    borderColor: "a value",
    borderStyle: "solid",
    borderWidth: "0.5vh",
    borderRadius: "50%"
  }
}
console.log(circleStyle);
0 голосов
/ 05 апреля 2020

Вы можете использовать троичный оператор, например, так:

    let circleStyle = {
        position: "relative",
        left: "50%",
        top: "45%",
        transform: "translate(-50%, 0)",
        borderColor: this.props.type ? 'someValue' : 'otherValue',
        borderStyle: "solid",
        borderWidth: "0.5vh",
        borderRadius: "50%",
        width: "20vh",
        height: "20vh",
    }

Если у вас более двух значений, вы можете определить функцию, которая возвращает строку на основе условия:

const getBorderColor = () => {
 switch(this.props.type) {
  case 'a':
   return 'someColor';
  case 'b':
   return 'otherColor';
  default:
   return 'defaultColor';
 }
}

и используйте его следующим образом:

let circleStyle = {
    position: "relative",
    left: "50%",
    top: "45%",
    transform: "translate(-50%, 0)",
    borderColor: getBorderColor(),
    borderStyle: "solid",
    borderWidth: "0.5vh",
    borderRadius: "50%",
    width: "20vh",
    height: "20vh",
}

Использование распространения (...) и создание нового объекта каждый раз может быть неэффективным, так что это также хороший способ решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...