কেন `রফতানি ডিফল্ট কনস্টাক্ট অবৈধ?


348

আমি দেখতে পাচ্ছি যে নিম্নলিখিতগুলি ভাল:

const Tab = connect( mapState, mapDispatch )( Tabs );
export default Tab;

তবে এটি ভুল:

export default const Tab = connect( mapState, mapDispatch )( Tabs );

তবুও এটি ঠিক আছে:

export default Tab = connect( mapState, mapDispatch )( Tabs );

এটি কেন constঅবৈধ সাথে দয়া করে ব্যাখ্যা করা যেতে পারে export default? এটি কি একটি অযৌক্তিক সংযোজন এবং যেমন ঘোষণা করা হয়েছে export defaultএমন কিছু constবা এরকম কিছু?



1
export default Tab = connect( mapState, mapDispatch )( Tabs );হওয়া উচিত export default connect( mapState, mapDispatch )( Tabs );। আপনি ভেরিয়েবল ট্যাব নয়, ফাংশন কলের ফলাফল এক্সপোর্ট করছেন।
থজায়

2
রফতানি মডিউলে একটি কনট বা লেট আবশ্যক (এবং প্রাসঙ্গিক) তবে আমদানি করা মডিউলে অপ্রাসঙ্গিক, যেখানে আমদানি করা শনাক্তকারীটি সর্বদা পঠনযোগ্য (কেবলমাত্র তাকে বরাদ্দ করা যায় না)। এটি এখনও ব্যাখ্যা করে না যে কেন "এক্সপোর্ট ডিফল্ট" এর বাক্য গঠনটি ডিফল্ট "রফতানি" থেকে আলাদা হয়।
ডেনিস হাও

উত্তর:


300

constএটির মতো let, এটি আপনার ব্লকের একটি শনাক্তকারীকে সংজ্ঞায়িত করতে ব্যবহৃত একটি লেক্সিকাল ডিক্লেয়ারেশন ( ভেরিয়েবলস্টেটমেন্ট, ঘোষণা )।

আপনি defaultকীওয়ার্ডটির সাথে এটি মিশ্রিত করার চেষ্টা করছেন , যা কোনও HoistableDeclaration, ClassDeclaration বা AssignmentE Expression এটি অনুসরণ করবে বলে আশা করে।

অতএব এটি একটি সিনট্যাক্স এরর


আপনি যদি constকিছু চান তবে আপনাকে সনাক্তকারী সরবরাহ করতে হবে এবং ব্যবহার করতে হবে না default

exportনিজে থেকে একটি ভেরিয়েবল স্টেটমেন্ট বা ডিক্লেয়ারেশনকে তার ডানদিকে গ্রহণ করে।


এএফআইকে রফতানি নিজেই আপনার বর্তমান সুযোগে কিছু যুক্ত করা উচিত নয়।


নিম্নলিখিতটি ঠিক আছেexport default Tab;

Tabনাম ডিফল্ট দেওয়া হওয়ায় একটি AssignmentE Expression হয়ে যায় ?

export default Tab = connect( mapState, mapDispatch )( Tabs ); ভাল

এখানে Tab = connect( mapState, mapDispatch )( Tabs );একটি AssignmentExpression রয়েছে


27
উত্তরটি এটি কীভাবে ত্রুটি হয়ে উঠেছে। প্রশ্ন এখনও কেন? এটি এই কারণে কনস্টের অপব্যবহার রোধ করার এক কারণ: রফতানি ডিফল্ট কনস্ট্যান্ড a = 1, খ = 3, সি = 4;
সের্গেই অরলভ

7
"AFAIK the export in itself should not add anything to your current scope"এর কারণ হল, তাই সঠিক নয় export const a = 1যোগ aআপনার বর্তমান প্রসঙ্গে। এমনকি সঙ্গে export defaultক্লাস ক্ষেত্রে, কারণ export default class MyClass {}যোগ MyClassআপনার বর্তমান প্রসঙ্গে হিসাবে ভাল।
আর্নেস্তো

4
@ সের্গেআরলভ সম্মত হন যে এটি ব্যাখ্যা করে যে এটি কীভাবে ত্রুটি সৃষ্টি করে, তবে কেন এটি প্রয়োজনীয় তা নিয়ে কিছুটা আলোকপাত করল না। যদিও আমি নিশ্চিত নই যে এটিই একমাত্র কারণ, আপনার সম্ভবত এটি পৃথক উত্তর হিসাবে পোস্ট করা উচিত, এটির কোনও মন্তব্য নয়।
হারিক

আমি যদি নিম্নলিখিতটি করি: let a; export default a;এবং এরপরে অন্যটি একটি মডিউলে ইতিমধ্যে আমদানি করা হচ্ছে তখন ভেরিয়েবলটি আপডেট করুন, কেন রফতানি ডিফল্ট ভেরিয়েবল আপডেট হয় না?
কে - এসও-তে বিষক্রিয়া বাড়ছে।

আমার বোধগম্যতা হ'ল সংক্ষেপে আপনি লিখতেও পারেন const foo = function bar() {}এবং তাও পারেন const Foo = class Bar {}না const foo = const bar = 1। একই জন্য export default, এটি ঠিক মত const foo =
zetavg

47

আপনি যদি এর পরিবর্তে ডিফল্ট একটি কনস্ট / লেট রফতানি করতে চান তবে আপনি এর মতো কিছু করতেও পারেন

const MyComponent = ({ attr1, attr2 }) => (<p>Now Export On other Line</p>);
export default MyComponent

আপনি এটির মতো কিছু করতে পারেন যা আমি ব্যক্তিগতভাবে পছন্দ করি না।

let MyComponent;
export default MyComponent = ({ }) => (<p>Now Export On SameLine</p>);

18

যদি উপাদানটির নামটি ফাইলের নামে ব্যাখ্যা করা হয় তবে কেবলমাত্র উপাদানটির নাম MyComponent.jsরাখবেন না, কোড স্লিম রাখে।

import React from 'react'

export default (props) =>
    <div id='static-page-template'>
        {props.children}
    </div>

আপডেট : যেহেতু এটি স্ট্যাক ট্রেসিং এ এটি অজানা হিসাবে লেবেল করে, এটির প্রস্তাবিত নয় isn't


14
আপনার স্ট্যাকট্রেসগুলি নিয়ে সমস্যা নেই? আমার জন্য এটি Unknownঅননুমোদিত ডিফল্ট রফতানি যেখানেই রয়েছে সেখানে প্রদর্শিত হচ্ছে
জুরোশ

2
এটি যখন কাজ করে, কোনও সন্দেহ ছাড়াই এটি খেলনা অ্যাপ্লিকেশন বিকাশের বাইরের প্রতিটি প্রতিক্রিয়া বিকাশকারীকে সর্বদা এড়াতে চেষ্টা করা উচিত ।
লি এক্স

1
@lix আমি বুঝতে পারছিলাম না কেন এই সিনট্যাক্সটি ব্যবহার করা উচিত। আপনি দয়া করে একটি লিঙ্ক ব্যাখ্যা বা ভাগ করতে পারেন? ধন্যবাদ।
সুদীপ

3
@ সুদিপ কোনও নাম ছাড়াই একটি উপাদান তৈরি করা প্রতিক্রিয়াযুক্ত উপাদান মডেল এবং রেন্ডারিংয়ের পক্ষে ভাল নয়।
ল এক্স এক্স

1
তবে দেখতে দেখতে পরিষ্কার দেখাচ্ছে, ড্যান আব্রামভও পরামর্শ দিয়েছেন যে উপাদানগুলির ঘোষণায় আমাদের সঠিক ফাংশন / কনস্ট নামগুলি ব্যবহার করা উচিত: twitter.com/dan_abramov/status/1255229440860262400 ;) "- স্ট্যাকের চিহ্নগুলিতে বেনামে হিসাবে প্রদর্শিত হবে - দেবটুলগুলিতে অজানা হিসাবে প্রদর্শিত হবে - প্রতিক্রিয়া-নির্দিষ্ট লিন্টের নিয়মগুলি দ্বারা চেক করা হবে না - ফাস্ট
রিফ্রেশের

9

পল এর উত্তর আপনি খুঁজছেন এক। তবে, ব্যবহারিক বিষয় হিসাবে, আমি মনে করি আপনি আমার নিজস্ব প্রতিক্রিয়া + রেডাক্স অ্যাপ্লিকেশনগুলিতে যে ধরণটি ব্যবহার করছেন তাতে আপনার আগ্রহী হতে পারে।

আমার রুটের একটি থেকে এখানে একটি প্রত্যাহারযোগ্য উদাহরণ রয়েছে যা দেখায় আপনি কীভাবে আপনার উপাদানটিকে সংজ্ঞায়িত করতে এবং একক বিবৃতি দিয়ে এটি ডিফল্ট হিসাবে রফতানি করতে পারেন:

import React from 'react';
import { connect } from 'react-redux';

@connect((state, props) => ({
    appVersion: state.appVersion
    // other scene props, calculated from app state & route props
}))
export default class SceneName extends React.Component { /* ... */ }

(দ্রষ্টব্য: আমি যে কোনও রুটের শীর্ষ স্তরের উপাদানটির জন্য "দৃশ্য" শব্দটি ব্যবহার করি)।

আমি আশা করি এই সহায়ক। আমি মনে করি এটি প্রচলিত তুলনায় অনেক পরিচ্ছন্ন দেখাচ্ছেconnect( mapState, mapDispatch )( BareComponent )


খুব খারাপ সজ্জকারগুলি কোনও ফাংশন উপাদানটিতে ব্যবহার করা হবে বলে মনে হচ্ছে না
এরিক Kim

পছন্দ করুন তবে, এটি মনে রাখবেন যে সজ্জাকারীর নকশাটি এখনও চূড়ান্ত নয়। সম্ভবত "লিগ্যাসি" সাজসজ্জার ব্যবহার করে ক্রিয়ামূলক উপাদানগুলি সজ্জিত করা যায় না, তবে আমি জানি না যে এটি লিগ্যাসির নকশার সীমাবদ্ধতার কারণে হয়েছে, বা লিগ্যাসি সাজসজ্জার বাস্তবায়ন অসম্পূর্ণ বা বগি কারণে। এফডব্লিউআইডাব্লু: @connectআমি ব্যবহার করি এমন একমাত্র ডেকরেটার , আমি কেবল এটি উপাদানগুলি ব্যবহার করি যা একটি হ্রাসযুক্ত স্টোরের সাথে সংযুক্ত থাকে, প্রায় প্রত্যেকটিরই একটি "রুট" হয় এবং প্রায় প্রতিটি রুটেই রাজ্য থাকা উচিত (এবং সেহেতু খাঁটি ফাংশন হতে পারে না) ।
টম

8

পল দ্বারা ভাগ করা উত্তরটি সেরা। আরও প্রসারিত করতে,

প্রতি ফাইলটিতে কেবলমাত্র একটি ডিফল্ট রফতানি হতে পারে। যেখানে একাধিক কনস্ট রফতানি হতে পারে। ডিফল্ট ভেরিয়েবলটি যে কোনও নামের সাথে আমদানি করা যায়, যখন কনস্ট ভেরিয়েবলটি তার নির্দিষ্ট নামের সাথে আমদানি করা যায়।

var message2 = 'আমি রফতানি হই';

ডিফল্ট বার্তা এক্সপোর্ট 2;

রফতানি বার্তা বার্তা = 'আমিও রফতানি'

আমদানি করার সময় আমাদের এটি এ জাতীয়ভাবে আমদানি করতে হবে:

'./test' থেকে {বার্তা import আমদানি করুন;

অথবা

'./test' থেকে বার্তা আমদানি করুন;

প্রথম আমদানির সাথে, কনস্ট ভেরিয়েবলটি আমদানি করা হয় যেখানে দ্বিতীয়টির সাথে ডিফল্ট একটি আমদানি করা হবে।


আপনার উত্তর ভালোবাসি, ধন্যবাদ!
হোয়াইট 159

0

default মূলত: const someVariableName

আপনার নামকরণকারী শনাক্তকারীর প্রয়োজন নেই কারণ এটি ফাইলের জন্য ডিফল্ট রফতানি এবং আপনি যখন এটি আমদানি করবেন তখন আপনি defaultযা খুশি তাই নামকরণ করতে পারেন, তাই কেবলমাত্র একটি একক কীওয়ার্ডের মধ্যে ভেরিয়েবল অ্যাসাইনমেন্টকে ঘনীভূত করা।


-3

আমার কাছে এটি অনেকগুলি আইডিসিএনক্র্যাসিগুলির মধ্যে একটি (আইডিয়ো (টি) এর উপর জোর দেওয়া) টাইপ স্ক্রিপ্ট যা লোকদের তাদের চুল টেনে তুলতে এবং বিকাশকারীদের অভিশাপ দেয়। সম্ভবত তারা আরও বোধগম্য ত্রুটি বার্তা নিয়ে কাজ করতে পারে on

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