একাধিক ইনলাইন স্টাইল অবজেক্টগুলিকে কীভাবে একত্রিত করবেন?


213

প্রতিক্রিয়াতে আপনি পরিষ্কারভাবে একটি অবজেক্ট তৈরি করতে এবং এটিকে একটি ইনলাইন শৈলী হিসাবে নির্ধারণ করতে পারেন। অর্থাত। নিচে উল্লিখিত.

var divStyle = {
  color: 'white',
  backgroundImage: 'url(' + imgUrl + ')',
  WebkitTransition: 'all', // note the capital 'W' here
  msTransition: 'all' // 'ms' is the only lowercase vendor prefix
};

var divStyle2 = {fontSize: '18px'};

React.render(<div style={divStyle}>Hello World!</div>, mountNode);

আমি কীভাবে একাধিক অবজেক্টগুলিকে একত্রিত করতে এবং তাদের একসাথে নির্ধারণ করতে পারি?


দুটি বস্তু দেখতে কেমন?
রায়ান 23

উত্তর:


397

আপনি যদি প্রতিক্রিয়া নেটিভ ব্যবহার করেন তবে আপনি অ্যারের স্বরলিপিটি ব্যবহার করতে পারেন:

<View style={[styles.base, styles.background]} />

এই সম্পর্কে আমার বিস্তারিত ব্লগ পোস্ট দেখুন


41
দুঃখের বিষয় আপনি নিয়মিত প্রতিক্রিয়াতে এটি করতে পারবেন না।
YoTengoUnLCD

8
আপনি প্রতিক্রিয়া-নেটিভ
ক্যালকাজার

শৈলীর নাম / মান যুক্ত করে আপনি বিদ্যমান ইনলাইন শৈলীতে সামান্য পরিবর্তন করতে পারেন। উদাহরণস্বরূপ,<View style={this.state.error == false ? styles.base : [styles.base, {backgroundColor: 'red'}]} />
গুরোল ক্যানব্যাক

দুটি স্ট্যাটিক শৈলীর জন্য, StyleSheet.compose()রেন্ডার ফাংশনের বাইরে করা আরও কার্যকর হতে পারে। এটি একটি নতুন স্ট্যাটিক স্টাইলশিট তৈরি করবে যা কেবল একবার ব্রিজের উপরে প্রেরণ করা হবে। (রানটাইমের সময় পরিবর্তন হওয়া স্টাইলগুলিতে বা
স্টাইলশিটের

282

আপনি স্প্রেড অপারেটরটি ব্যবহার করতে পারেন:

 <button style={{...styles.panel.button,...styles.panel.backButton}}>Back</button

8
আমি "সিনট্যাক্স ত্রুটি: অপ্রত্যাশিত টোকেন" পেয়েছি, প্রথম স্প্রেড অপারেটরের প্রথম বিন্দুর দিকে ইঙ্গিত করে।
ইজকাটা

@ ইজকাটা আপনি কি প্রতিক্রিয়া বা দেশীয় প্রতিক্রিয়াতে এমনটি করছেন, আপনি কি নিজের স্নিপেট পোস্ট করতে পারবেন
নাথ

প্রতিক্রিয়া জানান, এটি এমনই কিছু ছিল<div style={{ ...LEGEND_STYLE.box_base, ...{ 'background': '#123456' } }} />
ইজকাটা

আমি যাইহোক যাইহোক এটির মতো <div style={LEGEND_STYLE.box_gen('#123456')}কোনও সহায়ক ফাংশন ব্যবহার করার জন্য এটি পরিবর্তন করেছি , সুতরাং এটি আমার কাছে বড় কথা নয়
ইজকাটা

এমনকি স্প্রেড অপারেটরগুলি কেবল পুনরাবৃত্তিযোগ্যদের জন্য বৈধ বলে মনে করা হলেও অবজেক্টটির কেবল একটি কী-মান জুটি থাকলেও এটি কাজ করে! কেন আপনি ব্যাখ্যা করতে পারেন? বিকাশকারী.মোজিলা.আর.ইন-
টাইলার

47

আপনি এটি দিয়ে এটি করতে পারেন Object.assign()

আপনার উদাহরণে, আপনি এটি করবেন:

ReactDOM.render(
    <div style={Object.assign(divStyle, divStyle2)}>
        Hello World!
    </div>,
    mountNode
);

এটি দুটি স্টাইলকে একীভূত করবে। মিলের বৈশিষ্ট্য থাকলে দ্বিতীয় স্টাইলটি প্রথমটিকে প্রতিস্থাপন করবে।

ব্র্যান্ডন যেমন উল্লেখ করেছেন, আপনি ফন্টসাইজ প্রয়োগ Object.assign({}, divStyle, divStyle2)না করে পুনরায় ব্যবহার করতে চাইলে আপনার ব্যবহার divStyleকরা উচিত।

আমি এটি ডিফল্ট বৈশিষ্ট্যযুক্ত উপাদানগুলি তৈরি করতে ব্যবহার করতে চাই। উদাহরণস্বরূপ, এখানে একটি ডিফল্ট সহ সামান্য স্টেটলেস উপাদান রয়েছে margin-right:

const DivWithDefaults = ({ style, children, ...otherProps }) =>
    <div style={Object.assign({ marginRight: "1.5em" }, style)} {...otherProps}>
        {children}
    </div>;

সুতরাং আমরা এই জাতীয় কিছু রেন্ডার করতে পারি:

<DivWithDefaults>
    Some text.
</DivWithDefaults>
<DivWithDefaults className="someClass" style={{ width: "50%" }}>
    Some more text.
</DivWithDefaults>
<DivWithDefaults id="someID" style={{ marginRight: "10px", height: "20px"}}>
    Even more text.
</DivWithDefaults>

যা আমাদের ফলাফল দেবে:

<div style="margin-right:1.5em;">Some text.</div>
<div style="margin-right:1.5em;width50%;" class="someClass">Some more text.</div>
<div style="margin-right:10px;height:20px;" id="someID">Even more text.</div>

5
এই সমাধানটি সম্ভবত এমনভাবে অপব্যবহার Object.assign()করছে যা কিছু অনাকাঙ্ক্ষিত পরিণতির দিকে নিয়ে যায়। দেখুন উত্তর এখানে আরো একটি নির্ভরযোগ্য সমাধান।
ব্র্যান্ডন

1
আপনার উত্তরটি Object.assign () এর অপব্যবহারের একটি উপায় প্রদর্শন করে। এটি কিছু লোকের পক্ষে দরকারী তথ্য হতে পারে তবে এটি আমার উদাহরণের জন্য প্রযোজ্য নয়। এই উদাহরণটি কোনও বস্তুতে ডিফল্ট সংরক্ষণ করে তা পরিবর্তন করে অন্য কোনও জায়গায় পরিবর্তিত বস্তুকে পুনরায় ব্যবহার করে নয়।
Qel

একমত নন। আপনি Object.assign()আপনার উত্তরের দুটি পৃথক পদ্ধতিতে সম্বোধন করেছেন। প্রথমটি, প্রথম কয়েকটি বাক্যে, আমি চিহ্নিত অপব্যবহারের একটি উদাহরণ (যেমন, যদি ওপি আপনার প্রথম codeব্লকে পরামর্শ দেয় তবে সে পরিবর্তন করতে পারে {divStyle})। দ্বিতীয় উপায় - যেমন, আপনার যেমন এটি কোনও ফাংশনে মোড়ানো কাজ করবে, তবে উত্তরটি এটি পরিষ্কার করে না যে আপনি 'সাধারণ' গ্যাচা 'রিট অপরিচ্ছন্নতার আশেপাশে কাজ করছেন Object.assign()(যদিও ব্যক্তিগতভাবে আমি মনে করি এটি সামান্য প্রতিটি ডিফল্ট উপাদানগুলির জন্য কাস্টম স্টেটলেস ফাংশন লিখতে অসুবিধাজনক)।
ব্র্যান্ডন

ওহ ঠিক আছে. সেটা সত্য. যদি তিনি ফন্টসাইজ প্রয়োগ না করেই ডিভস্টাইল পুনরায় ব্যবহার করতে চান তবে প্রথমে এটি খালি বস্তুর প্রয়োজন need আমি উত্তর আপডেট করব।
qel

অবজেক্ট.সেসাইন () এখন পর্যন্ত একটি
উপসংহার

29

প্রতিক্রিয়া নেটিভ থেকে ভিন্ন, আমরা প্রতিক্রিয়া মধ্যে স্টাইলের অ্যারে পাস করতে পারে না, পছন্দ

<View style={[style1, style2]} />

প্রতিক্রিয়া হিসাবে, স্টাইলের সম্পত্তিতে স্থান দেওয়ার আগে আমাদের স্টাইলগুলির একক বস্তু তৈরি করতে হবে। ভালো লেগেছে:

const Header = (props) => {
  let baseStyle = {
    color: 'red',
  }

  let enhancedStyle = {
    fontSize: '38px'
  }

  return(
    <h1 style={{...baseStyle, ...enhancedStyle}}>{props.title}</h1>
  );
}

আমরা দুটি স্টাইল একত্রিত করতে ES6 স্প্রেড অপারেটর ব্যবহার করেছি । আপনি একই উদ্দেশ্যে অবজেক্ট.সেসাইন () ব্যবহার করতে পারেন ।

আপনার স্টাইলটি কোনও ভারে সংরক্ষণের প্রয়োজন না থাকলে এটিও কাজ করে

<Segment style={{...segmentStyle, ...{height:'100%'}}}>
    Your content
</Segment>

আমরা স্টাইলে অ্যারে পাস করতে পারি না?
হাইজেনবার্গ

3
কেবলমাত্র আপনার শেষ স্নিপেটে যোগ করতে, {{... সেগমেন্টস্টাইল, উচ্চতা: '100%'}। এছাড়াও কাজ করবে।
লুক ব্র্যান্ডন Farrell

26

Object.assign()এটি একটি সহজ সমাধান, তবে (বর্তমানে) শীর্ষের উত্তরের এটির ব্যবহার - স্টেটলেস উপাদান তৈরির ক্ষেত্রে ঠিক জরিমানা করার পরে, দুটি stateবস্তু একত্রিত করার জন্য ওপি'র পছন্দসই উদ্দেশ্যে সমস্যা তৈরি করবে ।

দুটি যুক্তি সহ, Object.assign()প্রকৃতপক্ষে ভবিষ্যতে তাত্পর্যকে প্রভাবিত করে প্রথম বস্তুকে ঠিক জায়গায় স্থানান্তরিত করবে।

উদা:

একটি বাক্সের জন্য দুটি সম্ভাব্য শৈলী কনফিগার বিবেচনা করুন:

var styles =  {
  box: {backgroundColor: 'yellow', height: '100px', width: '200px'},
  boxA: {backgroundColor: 'blue'},
};

সুতরাং আমরা আমাদের সমস্ত বাক্সের ডিফল্ট 'বাক্স' শৈলী রাখতে চাই, তবে কিছুটিকে আলাদা রঙ দিয়ে ওভাররাইট করতে চাই:

// this will be yellow
<div style={styles.box}></div>

// this will be blue
<div style={Object.assign(styles.box, styles.boxA)}></div>

// this SHOULD be yellow, but it's blue.
<div style={styles.box}></div>

একবার কার্যকর হলে Object.assign(), 'স্টাইলস.বক্স' অবজেক্টটি ভাল হিসাবে পরিবর্তিত হয়।

সমাধানটি হ'ল একটি খালি বস্তুটি পাস করা Object.assign()। এটি করার মাধ্যমে আপনি যে পদক্ষেপটি পাস করেছেন তা দিয়ে একটি নতুন অবজেক্ট তৈরি করার পদ্ধতিটি বলছেন। তাই ভালো:

// this will be yellow
<div style={styles.box}></div>

// this will be blue
<div style={Object.assign({}, styles.box, styles.boxA)}></div>

// a beautiful yellow
<div style={styles.box}></div>

স্থানে পরিবর্তিত বস্তুর এই ধারণাটি প্রতিক্রিয়ার জন্য গুরুত্বপূর্ণ, এবং Object.assign()রেডাক্সের মতো লাইব্রেরি ব্যবহারের জন্য যথাযথ ব্যবহার সত্যই সহায়ক।


1
অবজেক্ট.সেসাইন কীভাবে অপব্যবহার করবেন আপনার উদাহরণটি (বর্তমানে) শীর্ষ উত্তরে কীভাবে অবজেক্ট.সেসাইন ব্যবহার করা হচ্ছে তার বৈধ উপস্থাপনা নয়।
Qel

ধন্যবাদ, কোন দিকটি (বর্তমানে) অপব্যবহারের প্রতিফলন করার জন্য সম্পাদনাগুলি করা হয়েছে
ব্র্যান্ডন

1
ঠিক আছে কোডের টুকরো। অবজেক্ট.সাইনাইন ({}, this.state.showStartOverBtn?} This: this.hmitted, this.btnStyle)} কন্ডিশনালগুলিও একটি
কবজির

17

দেশীয় প্রতিক্রিয়াশ্রেণীর মধ্যে শৈলীর সমন্বয়ের সেরা উপায় হ'ল অ্যারে নোটিয়েন।

এটি 2 স্টাইলের অবজেক্টগুলিকে কীভাবে একত্রিত করতে পারে তা দেখায়,

<Text style={[styles.base, styles.background]} >Test </Text>

এটি কীভাবে স্টাইল অবজেক্ট এবং সম্পত্তি একত্রিত করতে দেখায়,

<Text style={[styles.base, {color: 'red'}]} >Test </Text>

এটি কোনও প্রতিক্রিয়াশীল নেটিভ অ্যাপ্লিকেশনটিতে কাজ করবে।


2
প্রশ্নগুলির জন্য React, নাReact Native
দিমিতর সোনেভ

আপনি প্রতিক্রিয়াটির জন্যও একই ব্যবহার করতে পারেন
সাসিন্ডু লক্ষীথা

প্রতিক্রিয়া শুরু থেকেই অ্যারে সমর্থন করে না এবং এখন এটি আর কাজ করে না।
উইটোং 623

প্রতিক্রিয়া এখনও এইভাবে সম্মিলন শৈলী সমর্থন করে না।
রাগ করা কিউই

12

আপনি এই জাতীয় ইনলাইন স্টাইলিংয়ের সাথে ক্লাসগুলি একত্রিত করতে পারেন:

<View style={[className, {paddingTop: 25}]}>
  <Text>Some Text</Text>
</View>

8

আসলে, এখানে একত্রিত করার একটি আনুষ্ঠানিক উপায় রয়েছে এবং এটি নীচের মতো:

<View style={[style01, style02]} />

তবে, এখানে একটি ছোট সমস্যা রয়েছে , যদি তাদের মধ্যে কোনওটি অভিভাবক উপাদান দ্বারা পাস করা হয় এবং এটি একটি সম্মিলিত আনুষ্ঠানিক উপায়ে তৈরি করা হয়েছিল আমাদের একটি বড় সমস্যা রয়েছে:

// The passing style02 from props: [parentStyle01, parentStyle02]

// Now:
<View style={[style01, [parentStyle01, parentStyle02]]} />

এবং এই শেষ পংক্তিতে ইউআই বাগ থাকার কারণ রয়েছে, তীব্রভাবে, রিএ্যাক্ট নেটিভ একটি অ্যারের ভিতরে কোনও গভীর অ্যারের সাথে ডিল করতে পারে না। সুতরাং আমি আমার সহায়ক ফাংশন তৈরি করি:

import { StyleSheet } from 'react-native';

const styleJoiner = (...arg) => StyleSheet.flatten(arg);

আমার styleJoinerযে কোনও জায়গায় ব্যবহার করে আপনি যে কোনও ধরণের শৈলী এবং শৈলী একত্রিত করতে পারেন। এমনকি undefinedবা অন্যান্য অকেজো প্রকারের ফলে স্টাইলিং ভাঙার কারণ হয় না।



2

প্রতিক্রিয়া হিসাবে এই সমাধানটি দেখছে এমনদের জন্য, আপনি যদি স্টাইলের অভ্যন্তরে স্প্রেড অপারেটরটি ব্যবহার করতে চান তবে আপনার ব্যবহার করা উচিত: ব্যাবেল-প্লাগ-ইন-ট্রান্সফর্ম-অবজেক্ট-বিশ্রামের প্রসার।

এটি এনপিএম মডিউল দ্বারা ইনস্টল করুন এবং আপনার .babelrc এর মতো কনফিগার করুন:

{
  "presets": ["env", "react"],
  "plugins": ["transform-object-rest-spread"]
}

তারপরে আপনি এর মতো ব্যবহার করতে পারেন ...

const sizing = { width: 200, height: 200 }
 <div
   className="dragon-avatar-image-background"
   style={{ backgroundColor: blue, ...sizing }}
  />

আরও তথ্য: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread/


2

এটিকে আরও এগিয়ে নিতে, আপনি একটি শ্রেণিবিন্যাসের মতো সহায়ক সহায়িকা তৈরি করতে পারেন :

const styleRules = (...rules) => {
  return rules.filter(Boolean).reduce((result, rule) => {
    return { ...result, ...rule };
  }, {});
};

এবং তারপরে এটি আপনার উপাদানগুলিতে শর্তসাপেক্ষে ব্যবহার করুন:

<div style={

  styleRules(
    divStyle,
    (window.innerWidth >= 768) && divStyleMd,
    (window.innerWidth < 768) && divStyleSm
  )

}>Hello World!</div>

0

সুতরাং মূলত আমি এটিকে ভুল উপায়ে দেখছি। আমি যা দেখছি তা থেকে এটি কোনও নির্দিষ্ট প্রতিক্রিয়া নয়, জাভা স্ক্রিপ্টের আরও অনেক প্রশ্ন আমি কীভাবে দুটি জাভাস্ক্রিপ্ট অবজেক্টকে একত্রিত করতে পারি (একইভাবে নামযুক্ত বৈশিষ্ট্যগুলি ক্লোবার্বিং না করে)।

এই স্ট্যাকওভারফ্লো উত্তরে এটি ব্যাখ্যা করে। আমি কীভাবে দুটি জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্যকে গতিশীলভাবে মার্জ করব?

JQuery এ আমি প্রসারিত পদ্ধতিটি ব্যবহার করতে পারি।


1
সিএসএস শৈলীযুক্ত বস্তুগুলির সাথে কাজ করার সময় কেবলমাত্র বস্তুকে মার্জ করা যথেষ্ট নয়। শর্টহ্যান্ড বৈশিষ্ট্য, বিভিন্ন অক্ষর আবরণ ইত্যাদি রয়েছে যা মার্জ করার মাধ্যমে সঠিক ক্রমে পরিচালনা করা উচিত। আমি সন্ধান করছি এবং এখনও একটি লাইব্রেরি পাওয়া যায় নি যা এই জাতীয় ফাংশন সরবরাহ করে।
সোমপিলার

এখানে একটি গ্রন্থাগার শর্টহ্যান্ড সম্পত্তি সম্প্রসারণ করতে পারে: github.com/kapetan/css-shorthand-expand , তবে এটি সম্পূর্ণ সমাধান নয়।
সোমপিলার

0

@ পাইথন আইসগ্রায়েট যা বলেছিলেন তার বিস্তৃত করার জন্য, আমি একটি বিশ্বব্যাপী ফাংশন তৈরি করি যা এটি আমার জন্য করবে:

var css = function(){
    var args = $.merge([true, {}], Array.prototype.splice.call(arguments, 0));
    return $.extend.apply(null, args);
}

এটি গভীরভাবে অবজেক্টগুলিকে একটি নতুন অবজেক্টে প্রসারিত করে এবং প্যারামিটার হিসাবে পরিবর্তনশীল সংখ্যক অবজেক্টের জন্য অনুমতি দেয়। এটি আপনাকে এরকম কিছু করতে দেয়:

return(
<div style={css(styles.base, styles.first, styles.second,...)} ></div>
);

var styles = {
  base:{
    //whatever
  },
  first:{
    //whatever
  },
  second:{
    //whatever
  }
}

সিএসএস শৈলীযুক্ত বস্তুগুলির সাথে কাজ করার সময় একটি সরল অবজেক্ট মার্জিং ফাংশন যথেষ্ট নয়। উপরের উত্তরে আমার মন্তব্য দেখুন।
সোমপিলার


0

ইনলাইন স্টাইলিংয়ের উপায়:

<View style={[styles.red, {fontSize: 25}]}>
  <Text>Hello World</Text>
</View>

<View style={[styles.red, styles.blue]}>
  <Text>Hello World</Text>
</View>

  <View style={{fontSize:10,marginTop:10}}>
  <Text>Hello World</Text>
</View>

3
প্রতিক্রিয়া শুরু থেকেই অ্যারে সমর্থন করে না এবং এখন এটি আর কাজ করে না।
উইটোং 623
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.